繁体   English   中英

是++(a = b); 快于a = b + 1;

[英]Is ++(a = b); faster than a = b + 1;?

使用++(a = b);是否更快++(a = b); 而不是a = b + 1;

据我了解,第一种方法包括以下操作:

  1. b的值移到a
  2. 增加a内存

而第二种方法是:

  1. b1推入堆栈
  2. 呼叫添加
  3. 将结果弹出到寄存器
  4. 移动寄存器a

它实际上需要更少的周期吗? 还是编译器(例如gcc)进行了优化,以至于没有影响?

编辑:直到至少在C ++ 11之前,才知道++(a=b) 错误的非法 UB。 尽管如此,我将在合法的情况下讨论这个问题,或者编译器会按照您的期望进行操作。

一般来说, a = b + 1; 是比较快的。

优化器肯定会使两者相同。 如果不是这样,则很可能会优化第二个版本,因为这是编写的非常常见的事情,而且与怪异的极端情况相比,优化器更容易识别常见的事情。

为什么我说优化后应该相同,但是第二个更快? 因为开发者的同伴。 每个人都认识到a = b + 1; 立即。 没人真正要考虑它。 另一种情况更可能引发类似“ wtf他那儿做什么为什么吗?”之类的反应。 很多人会找出你做了什么 ,最终出现。 有些不会。 有些人甚至可能因此引入错误。 很少人会发现,你为什么这样做,并在每次要读该行的时间仍然蹒跚。 每个人在阅读那条线时都会浪费时间去思考。 这就是为什么另一个更快的原因。

注意:假设您正在谈论内置类型(例如int或指针),所有这些都是无提示地编写的。 您对两者的作用的解释支持了这一点。 如果我们谈论的是UDT,则甚至不能保证这两行都做相同的事情。 然后,这完全取决于如何实现operator=operator++operator+以及从int进行的转换。 但是,如果实现让您考虑编写++(a=b) ,则它们很可能是糟糕的实现,应该加以改进而不是乱搞。

tl; dr:如果我发现您在我使用的任何代码库中都做++(a=b) ,我们必须认真谈一谈;-)

这个问题没有简单的答案。 这个问题已经用C ++进行了标记,因此在不知道所有操作数的确切类型的情况下,我们无法知道此代码的实际作用。 同样,代码出现的上下文将与优化器生成代码的方式有所不同-编译器可以对变量进行别名化,并将增量移入指令,使其在程序的更下方,例如,进入两个变量的有效地址计算。

但真正的问题是,您为什么在乎? 正如Arne所说,可读性要重要得多,您还没有发布任何差异都可以衡量的方案。

仅在确实引起问题时才担心它。

启用优化后,它们会为我生成完全相同的代码,因此它们将执行完全相同的代码。 这并不奇怪,因为两个语句的效果完全相同。

++(a = b); 是不确定的行为,因为有两个未测序修改 a

\n

虽然的 值计算 aa = b时的修改前测序 a由于 ++ ,的副作用 a = b (存储到 a )相对于的副作用未测序 ++ (再次,存储到 a )。

暂无
暂无

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

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