2014-05-09 29 views
1

我對模板函數有疑問。 如果我寫這樣模板的符號表條目

int function1(int x); 
int function1(int x, int y); 

兩個符號表條目的正常功能會爲功能1進行。每個條目代表每個重載函數。

在模板函數的情況下,究竟發生了什麼以及編譯器如何處理它。

template<class X> 
int function1(X a); 

模板函數將出現多少符號表條目?

+7

可能每個實例化一個。 –

回答

3

C++中沒有這樣的「模板函數」。有「功能模板」,即用於創建功能的模板(或可能是藍圖)。一旦你接受了這個,答案就會變得更容易被發現。

模板純粹是一個彙編構造。從模板實例化的每個函數(自然地)是一個函數,因此它將具有它自己的符號。

inline函數一樣,如果一個相同的函數(=使用相同的一組模板參數)以不同的翻譯單元(=不同的.cpp文件)從模板實例化,編譯器必須確保這些合併爲一個,因爲他們的地址必須相同。他們如何做是他們的實施細節;該標準只是要求他們必須這樣做。恐怕我不知道如何做這件事的技術細節,所以我不能提供一個例子。

+1

我最喜歡這個答案,但它錯過了具有相同模板參數的多個實例不會創建多個函數(或者它們融合在一起)的部分。 – nwp

+0

@nwp不幸的是,我對這個實際工作原理知之甚少,我可以添加一個一般性聲明,但僅此而已。 – Angew

+1

@nwp:不幸的是,這是一個自己的問題,因爲C++標準並不關注細節(它只是強制執行結果)。合併它們是一個工具鏈問題,每個工具鏈都可以自由使用他們認爲適合解決問題的任何方法。 –

0

肯定是「每個實例化一個」。

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 

link

+0

「答案」仍然有點短。還有更多要說的。如果你不必多說,你最好只是發表評論。 – Alfe

+0

從其他人的答案複製示例,沒有附加說明,不會改進此答案。 –

0

當您使用特定的模板參數的函數模板的實例,編譯器產生一個重載方法。所以,當你使用的方法

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代碼中不存在模板函數,只有實例化重載(如果有的話)。

0

在沒有人使用該模板創建編譯函數的情況下,實際上條目是在符號表中創建的。否則,對於模板的每種不同用途(對於每個類型或類型組合(如果有幾個類型參數),將創建一個更多的編譯函數,因此會創建一個更多的條目。

模板僅在編譯時評估;編譯後它們不再存在。