多个C ++ std :: string变量如何由GCC连接?

时间:2014-08-22 14:51:54

标签: c++ string gcc compiler-construction concatenation

我对GCC中std::string串联的内部实现感兴趣。具体来说,假设我想连接一些相对较大的字符串ab。我一般都非常担心字符串连接,而字符串在许多高级语言中都是不可变的。

#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'到一个足够大的块内存,还是使用和丢弃的中间变量?

1 个答案:

答案 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