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

Posted

技术标签:

【中文标题】GCC 如何连接多个 C++ std::string 变量?【英文标题】:How are mulitple C++ std::string variables concatenated by GCC? 【发布时间】:2014-08-22 14:51:54 【问题描述】:

我对 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'ing a' 'b'\n' 到足够大的内存块中,还是中间变量被使用和丢弃?

【问题讨论】:

a 的内容最终被复制了 3 次,您需要表达式模板或至少右值引用才能做得更好。顺便说一句,阅读源代码是了解它的作用的好方法...... @MarcGlisse 有机会我会翻遍 GCC 源代码,看看能不能找到。 gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/… 【参考方案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+/

连接字符串返回一个新构造的字符串对象及其 值是 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://***.com/a/9620055/362904

【讨论】:

天哪,真的吗?这就是我担心的!不过,您有一个错字;您的逻辑中缺少a @DouglasB.Staple 只是为了记录,我更新了答案并修正了错字

以上是关于GCC 如何连接多个 C++ std::string 变量?的主要内容,如果未能解决你的问题,请参考以下文章

将文本文件读入二维向量。 C++

为啥我会收到此错误? “[variable] 没有命名类型”在 C++ 中用于 std::string 数组,即使它已被包含并且在同一范围内

linux--GCC用法

Linux GCC常用命令

C ++:函数无法访问main()函数中定义的变量[关闭]

如何将javascript代码编译为c++或java