2017-12-18 217 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