C++ 函式模板實現原理剖析
阿新 • • 發佈:2020-11-27
C++ 函式模板實現機制原理剖析
重點
-
編譯器並不是把函式模板處理成能夠處理任意類的函式
-
編譯器從函式模板通過具體型別來產生不同的函式
-
編譯器會對函式模板進行兩次編譯
(1)在宣告的位置對模板程式碼進行編譯
(2)在呼叫的位置對引數替換後的程式碼進行編譯
示例
自己的程式碼:
#include<iostream> using namespace std; template <typename T> //宣告位置,第一次編譯 T myswap(T a, T b) { cout << "呼叫模板函式!!!" << endl; return 0; } int main() { myswap(1,1); //呼叫位置,第二次編譯 myswap('a','b'); myswap(2.0,3.0); }
實際編譯器處理後的程式碼:
#include<iostream> using namespace std; int myswap(int a, int b) { cout << "呼叫模板函式!!!" << endl; return 0; } double myswap(double a, double b) { cout << "呼叫模板函式!!!" << endl; return 0; } char myswap(char a, char b) { cout << "呼叫模板函式!!!" << endl; return 0; } int main() { myswap(1,1); myswap('a','b'); myswap(2.0,3.0); }
理解
-
函式模板不是說只 一個函式 就可以實現對任意資料型別的操作,而是通過兩次編譯生成了滿足我們呼叫需求所需要的所有程式碼。
-
函式模板使用後,編譯器並不會一開始就生成所有處理任何型別的函式,而是通過實際的函式呼叫來生成。比如呼叫函式時,需要處理int型資料,就生成處理int型資料的函式,而沒有用double型資料,就不會生成處理double型資料的函式。
-
編譯器內部幫我們實現了大量重複操作,讓程式設計師節省了大量程式碼