【问题标题】:Should I use operator+= instead of operator+ for concatenating std::string?我应该使用 operator+= 而不是 operator+ 来连接 std::string 吗?
【发布时间】:2015-04-28 11:19:55
【问题描述】:

我经常看到这种结构有什么原因:

std::string myString = someString + "text" + otherString + "more text";

...而不是这个(我很少看到):

std::string myString;
myString += someString += "text" += otherString += "more text";

阅读std::string API,在我看来operator+ 创建了很多临时变量(可能被编译器RVO 优化掉了?),而operator+= 变体只附加文本。

在某些情况下,operator+ 变体将是可行的方法。但是当您只需要将文本附加到现有的非常量字符串时,为什么不直接使用operator+=?有什么理由不这样做?

-雷恩

【问题讨论】:

  • 我上次测量性能时,执行许多 += 比执行许多 = 和许多 + 更快
  • 您要修改otherStringsomeString 吗?
  • 我不认为一种形式的优化会优于另一种形式。现在我们有复制省略和移动语义。 @Morb最后一次是什么时候,你使用了哪些优化级别?
  • 你总是可以使用既可读又高效的字符串流。
  • 第二个版本还能编译吗?我预计会出现某种与无法将字符串 += 字符串转换为字符串文字相关的错误。 (编辑:Yup, doesn't compile.

标签: c++ append concatenation stdstring


【解决方案1】:

operator+= 具有错误的关联性,您无法像第二个示例那样编写代码。为此,您需要像这样将其括起来:

(((myString += someString) += "text") += otherString) += "more text";

为您提供所需的可读性和效率的替代方法是使用std::stringstream

std::stringstream myString;
myString << someString << "text" << otherString << "more text";

【讨论】:

  • 错过了关于运算符关联性的事实。感谢您指出。
【解决方案2】:

std::string aaa += bbb;

类似于

std::string aaa = aaa + bbb;

所以在您的示例中将更改 someStringotherString。 在通常情况下,您无需担心使用 operator+ 时的临时变量 - 在发布模式下,所有临时变量都将被消除(RVO 和/或其他优化)。

【讨论】:

  • 我不认为优化评论是真的,操作符仍然会被调用,它不会神奇地不再做额外的内存分配
  • 嗯,所有主要的 c++ 编译器都使用了 RVO 优化(您可以在编译器说明中了解它)。这种优化取决于编译器标志:通常它在“调试”模式下打开并在“发布”模式下打开。在其他情况下,所有 std 容器都有在无法应用 RVO 时调用的移动构造函数。所以不会有额外的内存分配。
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2012-08-04
  • 2015-09-09
相关资源
最近更新 更多