繁体   English   中英

在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++?

在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并在将其保存回原始A位置之前添加B,而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 ++有运算符重载 ,这意味着te +=运算符可能意味着与您期望的完全不同的东西。

如果 “目标”类没有为其定义+=运算符,则+=运算符仅用作添加和赋值。 运算符重载也意味着,例如x++可能意味着不同的东西,具体取决于x的类实例为运算符重载定义的内容。

你应该更喜欢A += B;

如果您曾写过A = A + B;的类型A = A + B; 结果比A += B; 那么你应该改变operator+=的实现来做到A = A + B; 确实。

但是,反过来一般不能做; 你通常不能以任何合理的方式修改operator+以使A = A + B; 做与A += B;完全相同的事情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的值然后增加其值,这可能有些危险,或者至少降低一些性能。

您可以在这里查看更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM