C++中的预递增比后递增快--真?如果是,为什么?[duplicate]

z5btuh9x  于 2023-03-20  发布在  其他
关注(0)|答案(5)|浏览(118)

此问题在此处已有答案

Is there a performance difference between i++ and i in C?(20个答案)
4天前关闭。
我听说在C++中预增量(i)比后增量(i)快一些,这是真的吗?原因是什么?

r55awzrz

r55awzrz1#

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

niknxzdl

niknxzdl2#

在任何像样的编译器上,如果不使用该值,则i和i是相同的。
如果使用该值,则++i需要一个临时值来存储递增前的值(如果需要相同的语义)。

m528fe3b

m528fe3b3#

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

6l7fqoea

6l7fqoea4#

像int这样的普通类型的差异可能可以忽略不计。我猜编译器能够优化这样的情况(例如在适当的情况下把字尾改为字首)。不过,对于复杂类型(通常是STL迭代器,差异可能会很明显)。在这些情况下,编译器不能切换到前缀,因为操作符实际上可能会做完全不同的事情。我建议阅读STL Iterators and Performance,了解一些有关STL迭代器使用后增量时性能损失的背景信息(简短的故事:其花费两倍于预递增的时间)。

clj7thdc

clj7thdc5#

实际上,这要看情况而定。后增量需要一个副本,因为它保留了旧值。如果被增量的类型是复杂类型(例如迭代器)而不是简单类型,则前增量比后增量快。当然,只有当你不需要增量之前的值时,这才是真的。
有些编译器甚至可能检测到您不需要后增量,并优化副本--但一如既往--依赖它是一个坏习惯。

相关问题