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
连接的内部实现感兴趣。具体来说,假设我想连接一些相对较大的字符串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
'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 变量?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会收到此错误? “[variable] 没有命名类型”在 C++ 中用于 std::string 数组,即使它已被包含并且在同一范围内