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

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

本文关键字:than Is faster      更新时间:2023-10-16

使用++(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有两个未排序的修改。

尽管a = ba的值计算是在修改a++之前排序的,但a = b的副作用(存储到a)相对于++的副作用(再次,存储到a)是未排序的。