2017-12-18 277 views
0

我想知道模板代碼的代碼大小。 請考慮下面的代碼C++模板 - 代碼的用法,二進制的大小

template<typename T> 
class vector 
{ 
public: 

vector(size_t size) : 
{ 
    array = NEW T[size]; 
} 


uint32_t push_back(T value) 
{ 
... adding value to array and possible array realloction.. 
} 

private: 
T * array; 
} 

當我有兩個向量的情況下,

vector<float> v1; 
vector<int> v2; 

將它編有兩個push_back實現

push_back(float) 
push_back(int) 

或只有一個或別的東西爲二進制?

對於floatint,是否可以使用模板而不是分隔類來縮小代碼大小?

+7

編譯優化並生成一個映射文件。不同的編譯器/連接器會以不同的方式做事。 –

+0

這取決於你的編譯器,機器,優化級別和月亮週期...... – user1810087

+0

所以沒有一般​​的規則? GCC如何? –

回答

0

從模板實例化的類和函數在運行時它們之間沒有任何關係,因此函數將被複制。

一些編譯器會優化共享/重複代碼,但該優化的範圍比模板實例更寬。

請注意,即使代碼看起來相同,當使用某些操作符時,它可能會觸發不同的函數調用。

對於像std::vector<int*>std::vector<char*>這樣的指針容器,這是特別明顯的,雖然它們的行爲幾乎完全相同,但您將獲得不同的功能。總之,模板非常適合縮小代碼大小,但創建許多不同的實例會使二進制文件膨脹。

+3

恩,comdat摺疊msvc將消除具有相同的程序集的功能,所以你的聲明一般是錯誤的。 – Yakk

+0

@ tobi303 - 已修復。 – egur

+0

@Yakk - 我在第二段提到了編譯器優化。事實上,很多模板生成的代碼會產生不同的程序集,我在第3節中寫到了這一點 – egur