差異

2011-09-22 66 views
3

在我的教程閱讀此:差異

事實證明,C++不直接編譯所述模板函數。 相反,在編譯時,當編譯器遇到一個 模板函數的調用,它複製的模板功能,並與實際類型

我雖然是與普通相同取代 模板類型參數(非模板)功能。 我想了解編譯器如何處理這兩種功能,並且 主要區別在哪裏。 謝謝!

回答

2

我雖然它與常規(非模板)功能相同。

號大多數編譯器,編譯(非static)功能時,會發出只針對函數對象代碼(做整個程序優化時,他們可能會在以後更改,但不是所有的編譯器這樣做)。這不適用於模板函數,因爲(a)那些可能沒有足夠的信息來發出所有的目標代碼,並且(b)它們可能接受無限數量的模板參數的可能值,所以編譯器必須編譯無限的功能。

考慮

template <typename T> 
T add1(T x) 
{ 
    return x + 1; 
} 

此模板功能可以適用於任何類型的T爲其operator+的定義,可以採取int參數,因爲你可以使這種類型的自己與運算符重載,有一個潛在的無限他們的數量。

相反,在編譯時,當編譯器遇到調用模板 功能,它複製的模板函數和替換模板類型與實際類型

參數......但鏈接器會注意到,如果在多個模塊中使用add1對同一類型T(比如說,float),則編譯目標代碼在每種情況下都是相同的,並且它將刪除重複項。