最近再次看C++ PRIMER PLUS的時候看到這個部分感覺講得很爛,前后口徑不一致,所以寫個辨析讓自己明白的同時也希望對此不太清楚的朋友能搞懂。
總結一下,C++只有模板顯式實例化(explicit instantiation),隱式實例化(implicit instantiation),特化(specialization,也譯作具體化,偏特化)。首先考慮如下模板函數代碼:
template <typename T> void swap(T &a, T &b){ ... }
1.隱式實例化
我們知道,模板函數不是真正的函數定義,他只是如其名提供一個模板,模板只有在運行時才會生成相應的實例,隱式實例化就是這種情況:
int main(){ .... swap<int>(a,b); .... }
它會在運行到這里的時候才生成相應的實例,很顯然的影響效率
這里順便提一下swap<int>(a,b);中的<int>是可選的,因為編譯器可以根據函數參數類型自動進行判斷,也就是說如果編譯器不不能自動判斷的時候這個就是必要的;
2.顯式實例化
前面已經提到隱式實例化可能影響效率,所以需要提高效率的顯式實例化,顯式實例化在編譯期間就會生成實例,方法如下:
template void swap<int>(int &a,int &b);
這樣就不會影響運行時的效率,但編譯時間隨之增加。
3.特化
這個swap可以處理一些基本類型如long int double,但是如果想處理用戶自定義的類型就不行了,特化就是為了解決這個問題而出現的:
template <> void swap<job>(job a,job b){...}其中job是用戶定義的類型.
然后就沒有了。