【问题标题】:Why appending the string str += str2 is more optimal than str = str + str2? [duplicate]为什么附加字符串 str += str2 比 str = str + str2 更优化? [复制]
【发布时间】:2019-12-19 14:28:32
【问题描述】:

为什么前者比后者更优(最好用简单的英语回答)?

为什么这种方法更好

str = "hello ";
str2 = "world";
str += str2;

str = "hello ";
str2 = "world";
str = str + str2;

【问题讨论】:

  • 你在哪里看到它“更好”?
  • 想想str + str2返回什么
  • 在此处阅读更多信息stackoverflow.com/q/12479486/10858827
  • str + str2 返回一个临时的,它被移动(在旧的编译器中甚至可以被复制)到str。因此使用了 3 个字符串(strstr2 和临时字符串)。在str+= str2 中你正在做的相当于str.append(str2),它不仅有2 个字符串在使用,而且如果str 缓冲区足够大,它不需要为str 重新分配缓冲区内存
  • 您的“更优”前提是错误的,因为这两种方法在实践中可能同样最优。基于错误假设的问题的答案不一定有意义。此外,“更好”是一个主观术语。请说明一种方法应该以哪种方式更好(例如更快?更具可读性?更正确?等)。

标签: c++ string


【解决方案1】:

这里的问题是,更好的意思是什么。让我们假设,汇编代码不太复杂,并且可能在速度和大小上具有优势。

它还稍微取决于变量的限定符,很大程度上取决于编译器和编译器选项。

天真的方法和理解总是:对于x = x + y;,首先会计算加法的结果,然后将这个结果(临时)分配给原始变量。对于x += y,字符串 y 将直接附加到 x。

如果是字符串,则通过调用字符串追加函数来实现。

而且,如前所述,如果您不打开编译器优化,将首先进行追加操作,然后进行赋值。您可以检查生成的汇编代码。所以x = x + y确实比x += y更复杂。但是,如果您打开编译器优化(例如 gcc 的 -O3),则不会有任何区别。

“更好”可能还有其他解释。更具可读性,或更好的可维护性,或适合某些编码指南或某些运算符重载约束。所以很难给出一个具体的答案,结果可能是基于意见的。

【讨论】:

  • 所以命令行是 gcc file.c -O3。 C++ 呢?为什么你说结果是暂时的?
  • 是的,gcc 或 g++ 的参数“-O3”相同。临时存储中间结果是必要的(您不可见)。然后获取此中间结果并将其分配给目标字符串。加法和赋值是两种不同的操作。
  • 哦!我现在明白了。非常感谢,兄弟:)。
猜你喜欢
  • 1970-01-01
  • 2016-08-22
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2016-07-20
  • 2016-10-22
  • 2015-05-14
相关资源
最近更新 更多