我對模板函數有疑問。 如果我寫這樣模板的符號表條目
int function1(int x);
int function1(int x, int y);
兩個符號表條目的正常功能會爲功能1進行。每個條目代表每個重載函數。
在模板函數的情況下,究竟發生了什麼以及編譯器如何處理它。
template<class X>
int function1(X a);
模板函數將出現多少符號表條目?
我對模板函數有疑問。 如果我寫這樣模板的符號表條目
int function1(int x);
int function1(int x, int y);
兩個符號表條目的正常功能會爲功能1進行。每個條目代表每個重載函數。
在模板函數的情況下,究竟發生了什麼以及編譯器如何處理它。
template<class X>
int function1(X a);
模板函數將出現多少符號表條目?
C++中沒有這樣的「模板函數」。有「功能模板」,即用於創建功能的模板(或可能是藍圖)。一旦你接受了這個,答案就會變得更容易被發現。
模板純粹是一個彙編構造。從模板實例化的每個函數(自然地)是一個函數,因此它將具有它自己的符號。
與inline
函數一樣,如果一個相同的函數(=使用相同的一組模板參數)以不同的翻譯單元(=不同的.cpp文件)從模板實例化,編譯器必須確保這些合併爲一個,因爲他們的地址必須相同。他們如何做是他們的實施細節;該標準只是要求他們必須這樣做。恐怕我不知道如何做這件事的技術細節,所以我不能提供一個例子。
肯定是「每個實例化一個」。
A function template by itself is not a type, or a function, or any other entity.
No code is generated from a source file that contains only template definitions.
In order for any code to appear, a template must be instantiated: the template
arguments must be determined so that the compiler can generate an actual function
「答案」仍然有點短。還有更多要說的。如果你不必多說,你最好只是發表評論。 – Alfe
從其他人的答案複製示例,沒有附加說明,不會改進此答案。 –
當您使用特定的模板參數的函數模板的實例,編譯器產生一個重載方法。所以,當你使用的方法
temlate<class X>
int function1(X a);
使用像
function1<int>(5);
function1<double>(5.0);
編譯器生成
int function1(int a);
int function1(double a);
這些超載又會有2個符號。
實際上templates
很像macro
,具有較強的類型檢查。在編譯類型中,函數模板被實際實例取代。在object
代碼中不存在模板函數,只有實例化重載(如果有的話)。
在沒有人使用該模板創建編譯函數的情況下,實際上否條目是在符號表中創建的。否則,對於模板的每種不同用途(對於每個類型或類型組合(如果有幾個類型參數),將創建一個更多的編譯函數,因此會創建一個更多的條目。
模板僅在編譯時評估;編譯後它們不再存在。
可能每個實例化一個。 –