1. 程式人生 > 實用技巧 >C++ 函式模板實現原理剖析

C++ 函式模板實現原理剖析

C++ 函式模板實現機制原理剖析

重點

  1. 編譯器並不是把函式模板處理成能夠處理任意類的函式

  2. 編譯器從函式模板通過具體型別來產生不同的函式

  3. 編譯器會對函式模板進行兩次編譯

    (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);        
    
}

理解

  1. 函式模板不是說只 一個函式 就可以實現對任意資料型別的操作,而是通過兩次編譯生成了滿足我們呼叫需求所需要的所有程式碼。

  2. 函式模板使用後,編譯器並不會一開始就生成所有處理任何型別的函式,而是通過實際的函式呼叫來生成。比如呼叫函式時,需要處理int型資料,就生成處理int型資料的函式,而沒有用double型資料,就不會生成處理double型資料的函式。

  3. 編譯器內部幫我們實現了大量重複操作,讓程式設計師節省了大量程式碼