为什么没有模板函数比模板函数更多二进制

时间:2013-11-05 11:06:11

标签: c++ template-function

参见这个简单的程序

#include <cstdio>
#include <cstdlib>

void foo(){ printf("%d",1); }
int main(){ foo(); }

我用linux上的gcc 4.6.4 -std = c ++ 0x -O2 -g -Wall编译它。 二进制文件11`238字节。

但是这段代码产生了11个150字节:

#include <cstdio>
#include <cstdlib>

template< bool = false> void foo(){ printf("%d",1); }
int main(){ foo(); }

我也用clang 3.3测试,结果是5684字节和5636字节。

为什么模板版本功能没有更多二进制代码?

3 个答案:

答案 0 :(得分:3)

这只是猜测,但是:

在第一个示例中,foo具有外部链接且不是内联的。如果另一个翻译单元使用它,编译器可能会生成非内联版本;并且链接器可能不会将其删除,从而占用可执行文件中的空间。

在第二个示例中,foo是一个模板,因此链接器更有可能将其遗漏(因为当模板在多个转换中实例化时,它需要能够处理多个定义单元)。

你必须检查二进制文件以确定发生了什么。如果您声明第一个staticinline,也许会有所不同。

答案 1 :(得分:2)

我认为这里没有一般性答案;它完全取决于编译器的实现。

此外,差异非常小,所以很难确定这是一个正确的结论。

您应该阅读生成的代码;也许这可以为你提供一些关于削减字节的线索。

如果您在非模板版foo()中制作static,会有帮助吗?也许它是在一个案例中而不是在另一个案例中内联,等等。

答案 2 :(得分:0)

输出二进制文件取决于编译器的实现。在编译期间,它将生成符号表,这取决于函数名称。模板函数转换为更长的符号名称,这会增加二进制文件的大小。

您可以通过简单地将函数名称从foo更改为foo1来实现此目的,并将二进制文件增加一个字节。

剥离符号后,二进制文件具有相同的大小

-rwxr-xr-x 1 dejovivl dejovivl 6288 Nov  5 13:00 a.out*
-rwxr-xr-x 1 dejovivl dejovivl 6288 Nov  5 13:01 a.out*

要剥离符号,请使用strip

strip a.out