在C++中,A + = B优于A = A + B,同样地,++ A是A ++?

Mat*_*tch 6 c++

在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
}
Run Code Online (Sandbox Code Playgroud)

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

期望基本类型在编译时重新排列为相同,并且这实际上仅适用于需要运算符重载的复杂对象.

这是否一般扩展到大多数命令式语言?

Vau*_*ato 6

我会说原因并不完全相同.我对prefering主要原因A += B以上A = A + B是简洁. A += B清楚地说明你要将B添加到A.如果A是更复杂的表达式,则尤其如此:

node_capacities[std::make_pair(node1,node2)] += edge.capacity;
Run Code Online (Sandbox Code Playgroud)

我从来没有发现表现A += BA = A + B两者都差.


Som*_*ude 4

需要记住的重要一点是,C++ 具有运算符重载,这意味着+=运算符的含义可能与您的预期完全不同。

如果“目标”类没有为其定义运算符,则该运算符+=仅用作添加和分配。运算符重载还意味着eg可以表示不同的含义,具体取决于为运算符重载定义的类实例。+=x++x

  • 这是真的(或者一旦你解决了本杰明·林德利的评论),但我认为它并没有真正回答问题。最好意识到一些 C++ 代码很糟糕,这样您就知道在决定是否允许它进入您的项目之前先查看代码;但OP显然更感兴趣的是使用已经允许进入项目的非糟糕代码的最佳方式。(FWIW,OP显然已经意识到运算符重载,因为他(她)提到了它的名字,并给出了一个用“++x”实现“x++”的例子。) (2认同)