模板代码增加二进制文件的大小

BЈо*_*вић 5 c++ templates g++

人们常说,带有大量模板的代码会导致输出的大小增加,但这是真的吗?

#include <iostream>

#if 0
void foo( const int &v)
{
    std::cout<<v<<std::endl;
}
#else
template< typename T >
void foo( const T &v)
{
    std::cout<<v<<std::endl;
}
#endif

int main ()
{
    foo(50);
}
Run Code Online (Sandbox Code Playgroud)

上面的例子产生了不同大小的输出(功能为6.19k,模板功能为6.16k).为什么带有模板的版本更小?

如果重要的话,我正在使用g ++ 4.6.1,以及下一个选项-O3 -Wextra -Wall -pedantic.我不确定其他编译器的输出是什么.

Joh*_*itb 6

也许是因为foo在您的示例中有外部链接,因此即使内联调用它也会被发送到您的可执行文件中.

对于模板,如果内联调用,则没有理由发出隐式实例化的函数模板特化.

尝试制作foo一个inline功能或使之static.如果要发出函数模板特化,则需要显式实例化它

#else
template< typename T >
void foo( const T &v)
{
    std::cout<<v<<std::endl;
}
template void foo(const int&);
#endif
Run Code Online (Sandbox Code Playgroud)

这样做,我的度量为非模板函数和函数模板版本提供了完全相同的大小.