国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > 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

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

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐平市| 新巴尔虎左旗| 蓝田县| 丹凤县| 廉江市| 平南县| 安陆市| 沈阳市| 茂名市| 安多县| 邮箱| 肃南| 黎川县| 蕲春县| 双峰县| 沙河市| 舒城县| 栖霞市| 临泉县| 涿鹿县| 边坝县| 类乌齐县| 纳雍县| 乾安县| 长白| 瑞安市| 方城县| 鸡东县| 保康县| 叶城县| 河间市| 饶河县| 黄浦区| 文安县| 怀来县| 云梦县| 隆林| 白朗县| 武汉市| 灵台县| 内江市|