预增量比C ++中的后增量更快 - 是吗?如果是的话,为什么呢?

时间:2010-01-07 12:23:23

标签: c++

  

可能重复:
  Is there a performance difference between i++ and ++i in C++?

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

5 个答案:

答案 0 :(得分:54)

后增量通常涉及保留前一个值的副本并添加一些额外的代码。预增量只是做它的工作并且不受影响。我通常预先递增,除非语义会改变,实际上需要后增量。

答案 1 :(得分:9)

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

答案 2 :(得分:7)

普通类型类型(例如int)的差异可能可以忽略不计。我猜想编译器能够优化这种情况(例如,在适当的情况下将后缀转换为前缀增量)。但是,对于复杂类型(通常是STL迭代器,差异可能会很明显)。在这些情况下,编译器无法切换​​到前缀,因为操作符实际上可能完全不同。我建议阅读STL Iterators and Performance以获取有关使用STL迭代器后增量的性能损失的一些背景信息(简短的故事:它需要两倍的时间作为预增量)。

答案 3 :(得分:4)

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

如果使用该值,如果需要相同的语义,++ i将需要一个临时存储预增量值。

答案 4 :(得分:1)

实际上 - 这取决于。 Postincrement需要一份副本,因为它保留了旧值。如果增加的类型是复杂类型(例如迭代器)而不是简单类型,则前增量比后增量快。 如果您在增量之前不需要值,那么这当然是正确的。

有些编译器甚至可能会发现你不需要后增量并优化副本 - 但一如既往 - 依赖它是一种坏习惯。