3
在我的教程閱讀此:差異
事實證明,C++不直接編譯所述模板函數。 相反,在編譯時,當編譯器遇到一個 模板函數的調用,它複製的模板功能,並與實際類型
我雖然是與普通相同取代 模板類型參數(非模板)功能。 我想了解編譯器如何處理這兩種功能,並且 主要區別在哪裏。 謝謝!
在我的教程閱讀此:差異
事實證明,C++不直接編譯所述模板函數。 相反,在編譯時,當編譯器遇到一個 模板函數的調用,它複製的模板功能,並與實際類型
我雖然是與普通相同取代 模板類型參數(非模板)功能。 我想了解編譯器如何處理這兩種功能,並且 主要區別在哪裏。 謝謝!
我雖然它與常規(非模板)功能相同。
號大多數編譯器,編譯(非static
)功能時,會發出只針對函數對象代碼(做整個程序優化時,他們可能會在以後更改,但不是所有的編譯器這樣做)。這不適用於模板函數,因爲(a)那些可能沒有足夠的信息來發出所有的目標代碼,並且(b)它們可能接受無限數量的模板參數的可能值,所以編譯器必須編譯無限的功能。
考慮
template <typename T>
T add1(T x)
{
return x + 1;
}
此模板功能可以適用於任何類型的T
爲其operator+
的定義,可以採取int
參數,因爲你可以使這種類型的自己與運算符重載,有一個潛在的無限他們的數量。
相反,在編譯時,當編譯器遇到調用模板 功能,它複製的模板函數和替換模板類型與實際類型
參數......但鏈接器會注意到,如果在多個模塊中使用add1
對同一類型T
(比如說,float
),則編譯目標代碼在每種情況下都是相同的,並且它將刪除重複項。