![](/img/trans.png)
[英]I which situation will std::map<A,B> be faster than sorted std::vector<std::pair<A,B>>?
[英]Is ++(a = b); faster than a = b + 1;?
使用++(a = b);
是否更快++(a = b);
而不是a = b + 1;
?
据我了解,第一种方法包括以下操作:
b
的值移到a
a
内存 而第二种方法是:
b
和1
推入堆栈 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
在
a = b
时的修改前测序
a
由于
++
,的副作用
a = b
(存储到
a
)相对于的副作用未测序
++
(再次,存储到
a
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.