看这样的代码(已添加注释):
std::string some_var;
std::string some_func(); // both are defined, but definition is irrelevant
...
return "some text " + some_var + "c" + some_func(); // intentionally "c" not 'c'
我在想,
std::string
的operator +
在哪些情况下需要进行复制(即使用复制构造/赋值,而不是内部缓冲区被复制,例如如果应用了SSO),以及实际上复制了什么。快速查看cppreference只有部分帮助,因为它列出了12种(!)不同的情况。部分原因是我想确认我对该页面的理解:
- 情况1) 复制lhs,然后将rhs复制到此副本的末尾
- 在C++98情况2) - 5)中,从
char/const char*
参数构造了一个临时字符串,随后结果变为情况1) - 在C++11情况2) - 5)中,从
char/const char*
参数构造了一个临时字符串,随后结果为情况6)或7) - 在C++11情况6) - 12)中,r-value参数将通过
insert/append
进行变异,并且如果提供了char/const char*
参数,则由于对insert/append
的重载而不需要临时值。在所有情况下,返回r-value以便于进一步链接。不进行任何复制(除了要附加/插入到插入位置的参数的副本)。字符串的内容可能需要移动。
operator +
使用至少一个r-value参数,它似乎与operator +=
一样有效。这正确吗?在C++11及以后的版本中,除非两个参数都是l-value字符串,否则还有使用operator +=
的意义吗?编译器还可以进行哪些优化?请澄清问题意图。初始部分仅涉及语言的具体细节(不考虑实现);最后一个问题是关于额外的优化。
some_fun()
,请回滚。 - Bathshebag++ -save-temps
进行编译,并查看不同优化级别下生成的汇编代码输出,这是非常有益的。在-O3
优化级别下,您的代码将调用string::reserve()
一次和string::append()
四次。 - G. Sliepen