参见这个简单的程序
#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字节。
为什么模板版本功能没有更多二进制代码?
答案 0 :(得分:3)
这只是猜测,但是:
在第一个示例中,foo
具有外部链接且不是内联的。如果另一个翻译单元使用它,编译器可能会生成非内联版本;并且链接器可能不会将其删除,从而占用可执行文件中的空间。
在第二个示例中,foo
是一个模板,因此链接器更有可能将其遗漏(因为当模板在多个转换中实例化时,它需要能够处理多个定义单元)。
你必须检查二进制文件以确定发生了什么。如果您声明第一个static
或inline
,也许会有所不同。
答案 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