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

标签 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);
}

上面的示例生成不同大小的输出(函数为 6.19k,模板函数为 6.16k)。为什么带模板的版本变小了?

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

最佳答案

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

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

尝试将 foo 设为 inline 函数或将其设为 static。如果你想发出函数模板特化,你需要显式实例化它

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

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

关于c++ - 模板代码增加二进制文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8248908/

相关文章:

c++ - 使用terminos进行规范的串行读取失败?

c++ - 如何在 librdkafka 中正确重新发送失败的消息?

c++ - 两个类中的循环依赖 - 代码无法编译

c++ - "-D__STDC_FORMAT_MACROS"gnu 编译器选项

c++ - 我如何获得废弃的 boost::interprocess::interprocess_mutex 的所有权?

c++ - 多级/多继承期间对象的大小

templates - 像 Liquid 这样的嵌套 ERB 模板布局?

c++ - 为什么通用 lambda 不能调用自己,但将它包装在一个类中允许它?

c++ - 在类模板上使用 arm gcc 编译期间出现段错误

c++ - MinGW 编译时不生成目标文件