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型數據的函數。
-
編譯器內部幫我們實現了大量重復操作,讓程序員節省了大量代碼