函数模板中的文本字符串相同

时间:2015-02-01 05:06:16

标签: c++ templates

将长消息字符串保留在函数模板之外是否更好,或者编译器是否总是在这种情况下创建字符串的一个副本?我应该在模板功能之外放置“长错误消息”,例如在单独的printError函数中?

template<typename T>
function f( ARGS )
{
    if ( some_check(ARGS) ) 
        cout << "Long error message independent of T";

    ...
}

2 个答案:

答案 0 :(得分:3)

虽然答案取决于链接器支持的内容,但您可以合理地确定在启用任何级别的优化时,重复的字符串文字将合并为一个。

特别是,GCC提供了选项-fmerge-constants,只要链接器允许,它就会在编译单元中合并相同的常量,包括字符串文字。这是在-O, O2, O3 and -Os启用的。类似地,LLVM有一个优化传递-constmerge,它合并了重复的全局常量。

答案 1 :(得分:1)

编译器可能会为模板的每个实例创建一个字符串文字的副本,但除非你有几千字节的字符串,否则我怀疑它会产生任何实际影响。如果你有一个EXCESSIVELY长字符串,将它存储在函数模板之外就可以了。