在C ++中预增量比后递增快 – true? 如果是的话,为什么呢?

可能重复:
在C ++中,i ++和++ i之间有性能差异吗?

我听说preincrements(++ i)比C ++中的postincrements(i ++)快一点。 真的吗? 这是什么原因?

后增加通常包括保留前一个值的副本,并添加一些额外的代码。 预先增加只是它的工作,并避开。 我通常预先增量,除非语义会改变,后期增量实际上是必要的。

后增量必须制作对象的副本以返回未增值的值。 对于类types,这可能是重要的,但对于“类似”types(包括指针),它可能不是。

普通typestypes(如int)的差异可能可以忽略不计。 我猜测编译器能够优化这种情况(例如,在适当的时候将后缀变成前缀增量)。 但是,对于复杂types(通常是STL迭代器,差异可能是显而易见的)。 在这种情况下,编译器无法切换​​到前缀,因为操作员实际上可能会做完全不同的事情。 我推荐阅读STL迭代器和性能来了解一些使用STL迭代器的后期增量的性能损失的背景信息(短篇故事:它需要两倍于预增量的时间)。

在任何体面的编译器上,如果不使用该值,则++ i和i ++是相同的。

如果使用的值,++我需要一个临时存储的前增量值,如果相同的语义是想要的。

实际上 – 这取决于。 后增量需要一个副本,因为它保留了旧值。 如果增加的types是复杂types(如迭代器)而不是简单types,则预增量比后增量要快。 当然,如果你在增量之前不需要这个值,那才是真的。

一些编译器甚至可能会检测到你不需要一个后增量并优化拷贝 – 但是一如既往 – 依靠它是一个坏习惯。