将长消息字符串保留在函数模板之外是否更好,或者编译器是否总是在这种情况下创建字符串的一个副本?我应该在模板功能之外放置“长错误消息”,例如在单独的printError
函数中?
template<typename T>
function f( ARGS )
{
if ( some_check(ARGS) )
cout << "Long error message independent of T";
...
}
答案 0 :(得分:3)
虽然答案取决于链接器支持的内容,但您可以合理地确定在启用任何级别的优化时,重复的字符串文字将合并为一个。
特别是,GCC提供了选项-fmerge-constants
,只要链接器允许,它就会在编译单元中合并相同的常量,包括字符串文字。这是在-O, O2, O3 and -Os
启用的。类似地,LLVM有一个优化传递-constmerge
,它合并了重复的全局常量。
答案 1 :(得分:1)
编译器可能会为模板的每个实例创建一个字符串文字的副本,但除非你有几千字节的字符串,否则我怀疑它会产生任何实际影响。如果你有一个EXCESSIVELY长字符串,将它存储在函数模板之外就可以了。