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


免責聲明!

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



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