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

时间:2014-02-21 09:33:26

标签: c++ performance compilation heap

使用++(a = b);代替a = b + 1;会更快吗?

根据我的理解,第一种方法包括操作:

  1. b的值移至a
  2. 在内存中增加a
  3. 而第二种方法确实如此:

    1. b1推送到堆栈
    2. call add
    3. 将结果弹出到注册表
    4. 将注册表移至a
    5. 它实际上需要更少的周期吗?或者编译器(例如gcc)是否进行了优化,因此它没有什么区别?

3 个答案:

答案 0 :(得分:6)

编辑: TIL ++(a=b) 错误的非法 UB,至少在C ++之前的版本11中。不过,我会讨论这个,假设它是合法的,或者编译器做了你期望的事情。

一般来说,a = b + 1;更快。

优化器肯定会同时做到这两点。如果没有,它更有可能优化第二个版本,因为它是一个非常常见的事情,并且omtimizers比奇怪的角落情况更容易识别常见事物。

为什么我说优化后它应该是相同的,但第二个更快?因为开发人员。每个人都立即认出a = b + 1;。没有人真的要考虑它。另一种情况更有可能在" wtf中发生反应,他在那里做为什么?"。很多人最终会弄清楚你在那里做了什么。有些人不会。有些人甚至会因此而引入错误。很少有人会发现为什么你做了它,然而每次他们必须阅读该行时都会发现。 每个人 会在阅读该行时浪费时间。这就是为什么另一个更快的原因。

警告:假设您正在讨论内置类型(如int或指针),所有这些都是静默编写的。你对这两个人的支持的解释是什么。如果我们谈论UDT,那么这两条线甚至不能保证做同样的事情。然后,它完全取决于operator=operator++operator+的方式,并且可能会实现从int的转换。然而,如果实现让你考虑编写++(a=b),它们很可能是糟糕的实现,应该改进而不是被黑客攻击。

tl;博士:如果我发现在我工作的任何代码库中都在执行++(a=b),我们必须进行认真的谈话; - )< / p>

答案 1 :(得分:2)

这个问题没有简单的答案。问题已被C ++标记,因此我们无法知道这些代码实际上在做什么,而不知道所有操作数的精确类型。此外,代码出现的上下文将对优化器生成代码的方式产生影响 - 编译器可以对变量进行别名,并将增量移动到程序中的更多指令中,例如,转换为两个变量的有效地址计算。

但真正的问题是,你为什么关心?正如Arne上面所说,可读性更为重要,而且您没有发布任何差异会产生可衡量影响的情景。

只有在实际导致问题时才会担心。

答案 2 :(得分:1)

通过优化,它们为我生成完全相同的代码,因此它们的执行完全相同。这不应该是一个惊喜,因为两种陈述的效果完全相同。

++(a = b);是未定义的行为,因为a有两个未经修改的修改。

虽然aa = b值计算在修改a到期++之前已经排序,a = b(存储到a)的副作用相对于++的副作用(再次存储到a)没有排序。