麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 服務器 > Linux服務器 > 正文

Linux靜態鏈接庫與模板類的處理方式

2024-09-05 23:04:21
字體:
來源:轉載
供稿:網友

在閱讀本文之前,小編先給大家介紹一篇相關文章:Linux靜態鏈接庫使用類模板的快速排序算法

大家首先看下以上的文章對理解下面的知識點會有很大的幫助。

當模板遇到靜態鏈接庫會發生什么呢。

我們先按照常規思路去考慮一個靜態鏈接庫的步驟:

1.將某些功能提取出來,放進一個cpp文件,并將接口或者對外導出的類放在頭文件中

2.gcc -c編譯該文件,生成.o

3.ar命令將.o文件打包成.a,即靜態鏈接庫

4.編譯main函數,并將該靜態鏈接庫鏈接,生成可執行文件。

OK,按照這個思路,我們將之前寫的快速排序代碼修改后,如下:

lib_test.h:

//lib_test.h//head file of quick sort//users should realise operator > and <#ifndef LIB_TEST_H#define LIB_TEST_Htemplate<class T>class SORT{public:static void myQsort(T a[], int p, int r);static void myQsortNoRecur(T a[], int p, int r);private:static int partition(T a[], int p, int r);static void exchange(T a[], int i, int j);};#endif

lib_test.cc:

//lib_test.cc#include <iostream>#include <stack>#include"stdlib.h"#include <time.h>#include "lib_test.h"using namespace std;template<class T>void SORT<T>::exchange(T a[], int i, int j){T temp = a[i];a[i] = a[j];a[j] = temp;return;}template<class T>int SORT<T>::partition(T a[],int p,int r){int i = p;int j = p-1;T ref = a[p];int refId = p;srand((unsigned)time(NULL));refId = (rand() % (r-p+1))+ p;//cout<<refId<<endl;ref = a[refId];for(; i<=r; i++){if(a[i] < ref){j++;exchange(a, i, j);if(j == refId){refId = i;}}}exchange(a, j+1, refId);return j+1;}template<class T>void SORT<T>::myQsort(T a[],int p,int r){int q = 0;if(p<r){q = partition(a, p, r);myQsort(a, p, q-1);myQsort(a, p+1, r);}return;}template<class T>void SORT<T>::myQsortNoRecur(T a[], int p, int r){int start = p;int end = r;int mid = 0;std::stack<int> sortStk;sortStk.push(p);sortStk.push(r);while(!sortStk.empty()){end = sortStk.top();sortStk.pop();start = sortStk.top();sortStk.pop();if(start < end){mid = partition(a, start, end);sortStk.push(start);sortStk.push(mid -1);sortStk.push(mid + 1);sortStk.push(end);}}}

OK,我們嘗試編譯.a靜態鏈接庫

Linux,靜態鏈接庫,模板類,處理方式

 接下來,只需要將靜態鏈接庫編入main函數,就算完成了

Linux,靜態鏈接庫,模板類,處理方式

出問題了,發現我們編譯的靜態鏈接庫里面居然沒有這個myQsortNoRecur函數,可是我明明在快速排序這個類SORT里面實現了這個函數啊。

用nm命令看下:

Linux,靜態鏈接庫,模板類,處理方式

實實在在的,符號很少,確實沒有我之前寫的函數。這就奇怪了,今天下午在網上搜了很久,原來是模板類的原因導致的:

因為在編譯動態鏈接庫中,我們并沒有指定template class的type,那么靜態鏈接庫中自然不知道按照什么type去編譯該class中成員函數。

參考文獻:在動態庫和靜態庫中使用模板(dynamic libraries ,static libraries)

有沒有解決辦法呢?答案是肯定的,只要我們在靜態鏈接庫中申明一個type,并調用該指定type的函數,那么靜態鏈接庫中就有函數原型了。

我覺得可以把該過程稱為接口的“實例化”過程........

現在把lib_test.cc修改如下:

//lib_test.cc#include <iostream>#include <stack>#include"stdlib.h"#include <time.h>#include "lib_test.h"using namespace std;template<class T>void SORT<T>::exchange(T a[], int i, int j){T temp = a[i];a[i] = a[j];a[j] = temp;return;}template<class T>int SORT<T>::partition(T a[],int p,int r){int i = p;int j = p-1;T ref = a[p];int refId = p;srand((unsigned)time(NULL));refId = (rand() % (r-p+1))+ p;//cout<<refId<<endl;ref = a[refId];for(; i<=r; i++){if(a[i] < ref){j++;exchange(a, i, j);if(j == refId){refId = i;}}}exchange(a, j+1, refId);return j+1;}template<class T>void SORT<T>::myQsort(T a[],int p,int r){int q = 0;if(p<r){q = partition(a, p, r);myQsort(a, p, q-1);myQsort(a, p+1, r);}return;}template<class T>void SORT<T>::myQsortNoRecur(T a[], int p, int r){int start = p;int end = r;int mid = 0;std::stack<int> sortStk;sortStk.push(p);sortStk.push(r);while(!sortStk.empty()){end = sortStk.top();sortStk.pop();start = sortStk.top();sortStk.pop();if(start < end){mid = partition(a, start, end);sortStk.push(start);sortStk.push(mid -1);sortStk.push(mid + 1);sortStk.push(end);}}}namespace quick_sort_instance{void template_instance(){int a[]={1,2};SORT<int>::myQsortNoRecur(a, 0, 1);}}

好,重復上面的編譯過程:

Linux,靜態鏈接庫,模板類,處理方式

這些編譯和執行過程就能正常進行了。

 

但是這種所謂的“實例化”過程有一個明顯的缺點,那就是,本身這個SORT類是一個模板類,可以排序任意類型的數據,

就本例子而言,只“實例化”了一種int類型的接口。因此當我想排序一個float類型的數組時,我就必須在.a文件里面再“實例化”一個float接口。

顯然,假如我想把該具有sort功能的類,抽象成一個獨立的模塊,但是我并不知道該.a的用戶想排序的數據類型是什么,那么將必須窮舉所有的數據類型

這顯然是不可能的。這一局限性不只時模板類,同樣的,模板函數也是如此。

結論:最好不要在靜態鏈接庫中使用模板,同樣的,動態鏈接庫也一樣。

想到這里,腦子里忽然蹦出來一個想法:C++的STL到底是動態鏈接韓式靜態鏈接的呢?STL使用了大量的模板,按照這篇博客在討論的內容,似乎是矛盾的。在網上找了半天

參考知乎的大神們是怎么解釋的吧:

https://www.zhihu.com/question/46098144

以上就是本文的全部心得和內容,如果大家還有所疑問和建議,可以在下面的留言區討論。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲国产高清自拍 | 国产自在自线午夜精品视频在 | 亚洲精品在线观看免费 | 污污短视频 | 久久久久久久黄色片 | 免费看欧美黑人毛片 | 色吧综合网 | asian gaysex| 深夜免费观看视频 | 一级电影免费看 | 精品一区二区久久久 | 国产色视频免费 | 今井夏帆av一区二区 | 亚洲一区成人 | 成人啪啪18免费网站 | 国产精品久久久久国产精品三级 | 亚洲午夜影院在线观看 | 日本中文字幕久久 | av免费在线播放网址 | 久久久青 | 色欲香天天天综合网站 | 免费看毛片网站 | 亚洲一区二区三区视频免费 | 韩国精品视频在线观看 | 久久综合av | 羞羞网站入口 | 日韩视频一 | 久久久久国产成人精品亚洲午夜 | 娇妻被各种姿势c到高潮小说 | www国产成人免费观看视频 | 免费看黄色一级片 | 免费网址黄 | 亚洲影视在线观看 | 国产乱子视频 | 日产精品久久久一区二区开放时间 | 成人男女啪啪免费观看网站四虎 | 欧美乱论| 国产精品色在线网站 | 欧美成人一区二区视频 | hd porn 4k video xhicial | 亚洲精久 |