【发布时间】:2016-09-30 08:05:03
【问题描述】:
如果我有例如此代码:
string x = "xyz"
x=x+"qwe";
前面的操作是如何工作的,它是否分配了一个大小为 x 两倍的新字符串,然后它复制旧元素,然后复制新元素?
【问题讨论】:
-
和
x.operator=(x.operator+("qwe"));一样。
标签: c++ string concatenation
如果我有例如此代码:
string x = "xyz"
x=x+"qwe";
前面的操作是如何工作的,它是否分配了一个大小为 x 两倍的新字符串,然后它复制旧元素,然后复制新元素?
【问题讨论】:
x.operator=(x.operator+("qwe"));一样。
标签: c++ string concatenation
没有编译器优化,是的。 x+"qwe" 是一个可以在任何地方使用的表达式,而不仅仅是在 x 赋值的右侧,因此它将创建一个长度为 6 的新 std::string 对象。在第二步中,x被赋予这个新的 std::string 对象的值,并且新的字符串对象被丢弃。启用优化的智能编译器可能足够聪明,可以一开始就消除临时对象的创建,但当然不能保证。
如果你想强制执行,你可以改写:
x += "qwe";
这会阻止任何临时对象的创建。如果新大小超过其容量,字符串对象仍可能需要分配内存。您可以通过查看 x.capacity() 来检查这一点,如果您关心实时性,可以使用 x.reserve() 预先保留内存。
【讨论】: