C++模板顯式實例化,隱式實例化,特化(具體化,偏特化)辨析


最近再次看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是用戶定義的類型.


然后就沒有了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM