在C++中,A+=B 是否优于 A=A+B,就像 ++A 优于 A++ 一样

In C++, is A+=B preferable to A=A+B in the same way ++A is to A++?

本文关键字:++A 就像 A+B 优于 一样 A++ C++ 是否      更新时间:2023-10-16

在C++中,A+=B是否比A=A+B更可取,就像++A比A++更好吗?

我知道"++A"预增量保证至少与"A++"后增量一样快。这在很多地方都有讨论,包括这里和这里。同样,A+=B 预计至少与 A=A+B 一样快,就像这里一样。

我正在为 ++ 查看这个:

//From https://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/
T T::operator++(int)() {
auto old = *this; // remember our original value
++*this;          // always implement postincr in terms of preincr
return old;       // return our original value
}

我的推理是,在最坏的情况下(可能来自复杂的对象类型),A=A+B 必须检索和存储 A 并添加 B,然后再将其保存回原始 A 位置,而 A+=B 将采用 B 并将其直接添加到 A。我的推理正确吗?

预计基本类型在编译时被重新排列为相同,这实际上仅适用于需要运算符重载的复杂对象。

这是否普遍适用于大多数命令式语言?

我会

说原因并不完全相同。 我更喜欢A += B而不是A = A + B的主要原因是简洁。 A += B明确指出您要将 B 添加到 A。 如果A是一个更复杂的表达式,则尤其如此:

node_capacities[std::make_pair(node1,node2)] += edge.capacity;

我也从未发现A += B的表现比A = A + B差。

要记住的一件大事是C++有运算符重载,这意味着运算符+=可能意味着与你期望完全不同的东西。

仅当"目标"类没有为其定义+=运算符+=运算符才用作添加和赋值。运算符重载还意味着,例如x++可能意味着不同的事情,具体取决于x的类实例为运算符重载定义的内容。

你应该更喜欢A += B;

如果你曾经写过一个A = A + B;A += B;更好的类型,那么你应该改变operator+=的实现,以完全按照A = A + B;的作用去做。

但是,通常不能反之道而行之;您通常无法以任何合理的方式修改operator+以使A = A + B;执行与A += B;完全相同的事情。

因此,如果A += B;A = A + B;之间存在差异,您应该期望A += B;是更好的选择。

在大多数情况下,A+=B 更可取。正如您所指出的,A = A + B 与 A+=B 中会有更多的寄存器负载。另外,阅读SSA可能也很有趣。这用于编译器优化,可能有助于了解如何处理这种情况。正如你所说,由于编译器,大多数这些考虑都从程序员手中拿走了,但了解这些事情是件好事。

在复杂对象中要考虑的另一个考虑因素是调用 getter 可能引起的副作用,以及调用此类 getter 两次的后果。(想想,A.get() = A.get() + B.get())。然而,这应该是相对罕见的,因为在大多数情况下,吸气剂不应该有副作用。

事实上,在C++中,你应该避免使用后缀运算符:

  • ++a//这里运算符 ++ 以前缀
  • a++//这里运算符 ++ 是后缀

仅仅因为后缀解决方案将使用 a 的值,然后增加其值,这有时可能是危险的,或者至少会降低某些性能。

您可以在此处查看更多信息。

相关文章: