導航:首頁 > 源碼編譯 > 編譯的函數模版

編譯的函數模版

發布時間:2025-01-13 13:05:01

㈠ c++primer3中,有一句話:「在多個文件之間編譯相同的函數模板定義增加了不必要的編譯時間」……

簡單點說,對於一個vector<int>的函數,比如size(),如果在不同的cpp中出現,在這些文件編譯的時候都要把vector<int>::size()編譯一遍。然後在鏈接的時候把重復的函數去掉。很顯然增加了編譯時間。

補充里你的理解是錯的,模板的聲明是不編譯的,更沒有空間,它根本不是實際的類型或函數,編譯器根本不管它。只有實例化的時候,才生成真正的類型、函數,而實例化的地方不在一起,必然造成同一個類型、函數被編譯了多次。反觀類的編譯,只在它的cpp中編譯一次,其他地方都使用它的頭文件得到聲明。

㈡ 在c語言中如何實現函數模板

如果要寫個函數支持多種數據類型,首先想到的就是C++的模板了,但是有時候只能用C語言,比如在linux內核開發中,為了減少代碼量,或者是某面試官的要求…
考慮了一陣子後,就想到了qsort上.qsort的函數原型:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
鋒碼快排時,只要自己實現相應數據類型的比較函數cmpare就可以了.如果比較int型時,一個典型的compare函數如下:

那麼,就是說可以利用void *. void *意指未指定類型,也可以理解為任意類型。其他類型的指針可以直接賦值給void *變數,但是void *變數需要強制類型轉換為其它指針類型。這個相信大家都知道。那麼下面以一個簡單的題目為例,來探討如何在C語言中實現模板函數。
方法1: 利用void *.
在看下面的源程序之前,需要了解幾點。首先,在32位平台上,任何類型的指針所佔的位元組都是4個位元組,因為32位機器虛擬內存一般為4G,即2的32次方,只要32位即4個位元組就可以足夠定址,sizeof(void *)=4; 其次,雖然各種不同類型的指針所佔的空間都為4個位元組,但是不同類型的指針所指的空間的位元組數卻不同(這一點尤為重要,下面的程序我在開始沒有調通就因為這點意識不強)。所以,如果你將一個指針強制轉換為另一個類型的指針,指針本身所佔的位元組是不變的,但是,如果對這個指針進行運算,比如 *p,p++,p-=1等一般都是不同的。 再次,函數指針應該了解下,這里不多說。 最後,因為Sandy跟我說,C++開始的時候模板的實現其冊型實就是利用宏替換,在編譯的時候確定類型。所以,為了方便,類型也用了預編譯指令#define。

<span>#include"stdio.h"</span>

<span>#include"stdlib.h"</span>

<span>//typedefintT;//或者下面的也可以.</span>

<span>#defineTint</span>

//這個FindMin是Sandy寫的.felix021也寫了個,差不多的就不貼出來的.

voidFindMin(constvoid*arr,intarr_size,intarrmembersize,int*index,

int(*cmp)(constvoid*,constvoid*b)){

inti;

*index=0;

char*p=(char*)arr;

char*tmp=p;

for(i=1;i<arr_size;i++){

if(cmp(tmp,p)>0){

tmp=p;

}

p+=arrmembersize;

}

(*index)=((int)(tmp-arr))/arrmembersize;

}

*/</span>

可以把指針看作是char*,如果轉換為int*,那下面的位移就銀姿哪不正確了.</span>

index<span>=</span>i<span>;</span>

<span>}</span>

<span>}</span>

<span>return</span>index<span>;</span>

<span>}</span>

<span>int</span>result<span>;</span><span>//result保存的是最小值索引.</span>

result<span>=</span>FindMin<span>(</span>arr,<span>12</span>,

㈢ C++模板和模板的特化,模板的擴展

模板的作用是實現類型通用,降低代碼的冗餘度。它可以為一種演算法定義不同類型的版本。

實現機制:通過復制代碼使用類型參數突破類型的限制,雖然喪失一定的類型安全,但模板需要實例化才能使用,實例化由編譯器完成。

模板的分類包括函數模板和類模板。函數模板是帶類型參數的函數,支持類型推斷;而類模板則是帶類型參數的類,不支持類型推斷。

函數模板的語法是:template 返回值類型 函數模板名(形參列表) { …… }。調用時,函數模板名(實參); 如果類型參數可以通過實參判斷,傳遞的類型可以省略。

類模板的語法是:template class 類模板名 { …… }。使用時,類模板名 對象;。

模板的特化用於重新定義某些特殊類型的行為。函數模板的特化語法是:template > 返回值類型 函數模板名(參數列表) { …… }。類模板的特化語法是:template > class 類模板名 { …… }。

類模板的成員特化可以是全類特化或局部特化。局部特化可以針對有多個類型參數的類模板,只特化其中一部分參數。

模板參數的默認值、非類型參數和模板參數模板是模板的高級特性。模板可以作為類模板或類的成員/友元,STL的實現使用了該語法。

類模板的繼承可以通過語法實現,包括類繼承類模板和類模板繼承類模板。

模板的遞歸實例化是指使用類模板實例化後作為參數繼續實例化本模板。

模板的劃分用於將類的聲明(模板的聲明)寫在頭文件,類/類模板中的函數實現寫在源文件,因為模板的實例化是在編譯時完成的。

閱讀全文

與編譯的函數模版相關的資料

熱點內容
ie文件夾禁止訪問 瀏覽:543
百川互聯網程序員 瀏覽:781
linuxpython解釋器 瀏覽:665
興安得力軟體加密狗 瀏覽:490
智能網路攝像頭加密 瀏覽:574
軟體畢業程序員培訓 瀏覽:650
安卓陀螺儀低怎麼辦 瀏覽:245
一級建造師復習題集pdf 瀏覽:903
法理學pdf海默 瀏覽:390
伺服器內存儲器是用什麼的 瀏覽:817
微幫同城分類信息源碼 瀏覽:808
安卓系統ad是什麼 瀏覽:471
python輸出中不加佔位符 瀏覽:596
linux文件夾許可權控制 瀏覽:728
雅虎郵箱怎麼加密碼 瀏覽:819
為什麼安卓手機登錄不了蘋果賬號 瀏覽:535
如何復制usb加密狗 瀏覽:801
哪個app看你微笑時很美 瀏覽:908
mac啟動命令 瀏覽:602
ngc伺服器是什麼的簡稱 瀏覽:75