使用++(a = b);
代替a = b + 1;
会更快吗?
根据我的理解,第一种方法包括操作:
b
的值移至a
a
而第二种方法确实如此:
b
和1
推送到堆栈a
它实际上需要更少的周期吗?或者编译器(例如gcc)是否进行了优化,因此它没有什么区别?
答案 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
有两个未经修改的修改。
虽然 a
中a = b
的值计算在修改a
到期++
之前已经排序,a = b
(存储到a
)的副作用相对于++
的副作用(再次存储到a
)没有排序。