我对GCC中std::string
串联的内部实现感兴趣。具体来说,假设我想连接一些相对较大的字符串a
和b
。我一般都非常担心字符串连接,而字符串在许多高级语言中都是不可变的。
#include <iostream>
int main(){
std::string a = "This would be some kind of data.";
std::string b = "To be concatenated with this, and other things.";
// Is building c this way equivalent to strcpy'ing a, ' ', b, and '\n' into
// a sufficiently large chunk of memory, or are intermediate variables used
// and discarded?
std::string c = a + ' ' + b + '\n';
std::cout << c;
}
以这种方式构建c
等同于strcpy
'a
,' '
,b
和'\n'
到一个足够大的块内存,还是使用和丢弃的中间变量?
答案 0 :(得分:1)
std::string c = a + ' ' + b + '\n';
会:
std::string tmp1 = a.operator+('');
std::string tmp2 = tmp1.operator+(b);
std::string c = tmp2.operator+('\n');
http://www.cplusplus.com/reference/string/string/operator+/
Concatenate strings返回一个新构造的字符串对象 value是lhs中后跟的字符的串联 rhs的那些。
启用优化后,编译器将/可能删除这些不必要的副本
或者手动预先分配字符串。
std::string c;
c.reserve(a.size()+1+b.size()+1);
c += a;
c += ' ';
c += b;
c += '\n';
现在它不会创建那些临时对象。
即使没有reserve
。它不会经常(在大字符串上)重新分配。
因为缓冲区增长new_size=2*size
(在libstdc ++中)
另见std::string and its automatic memory resizing
另外值得一提的是C ++ 11可以std::move
内存,请参阅https://stackoverflow.com/a/9620055/362904