此问题在此处已有答案:
Is there a performance difference between i++ and i in C?(20个答案)4天前关闭。我听说在C++中预增量(i)比后增量(i)快一些,这是真的吗?原因是什么?
r55awzrz1#
后增量通常涉及到保留前一个值的副本并添加一些额外的代码。预增量只是完成它的工作并避开它。我通常会预增量,除非语义会改变,并且后增量实际上是必要的。
niknxzdl2#
在任何像样的编译器上,如果不使用该值,则i和i是相同的。如果使用该值,则++i需要一个临时值来存储递增前的值(如果需要相同的语义)。
m528fe3b3#
后增量必须复制对象以返回未增量的值。对于类类型,这可能很重要,但对于“类整型”类型(包括指针),这可能不重要。
6l7fqoea4#
像int这样的普通类型的差异可能可以忽略不计。我猜编译器能够优化这样的情况(例如在适当的情况下把字尾改为字首)。不过,对于复杂类型(通常是STL迭代器,差异可能会很明显)。在这些情况下,编译器不能切换到前缀,因为操作符实际上可能会做完全不同的事情。我建议阅读STL Iterators and Performance,了解一些有关STL迭代器使用后增量时性能损失的背景信息(简短的故事:其花费两倍于预递增的时间)。
clj7thdc5#
实际上,这要看情况而定。后增量需要一个副本,因为它保留了旧值。如果被增量的类型是复杂类型(例如迭代器)而不是简单类型,则前增量比后增量快。当然,只有当你不需要增量之前的值时,这才是真的。有些编译器甚至可能检测到您不需要后增量,并优化副本--但一如既往--依赖它是一个坏习惯。
5条答案
按热度按时间r55awzrz1#
后增量通常涉及到保留前一个值的副本并添加一些额外的代码。预增量只是完成它的工作并避开它。我通常会预增量,除非语义会改变,并且后增量实际上是必要的。
niknxzdl2#
在任何像样的编译器上,如果不使用该值,则i和i是相同的。
如果使用该值,则++i需要一个临时值来存储递增前的值(如果需要相同的语义)。
m528fe3b3#
后增量必须复制对象以返回未增量的值。对于类类型,这可能很重要,但对于“类整型”类型(包括指针),这可能不重要。
6l7fqoea4#
像int这样的普通类型的差异可能可以忽略不计。我猜编译器能够优化这样的情况(例如在适当的情况下把字尾改为字首)。不过,对于复杂类型(通常是STL迭代器,差异可能会很明显)。在这些情况下,编译器不能切换到前缀,因为操作符实际上可能会做完全不同的事情。我建议阅读STL Iterators and Performance,了解一些有关STL迭代器使用后增量时性能损失的背景信息(简短的故事:其花费两倍于预递增的时间)。
clj7thdc5#
实际上,这要看情况而定。后增量需要一个副本,因为它保留了旧值。如果被增量的类型是复杂类型(例如迭代器)而不是简单类型,则前增量比后增量快。当然,只有当你不需要增量之前的值时,这才是真的。
有些编译器甚至可能检测到您不需要后增量,并优化副本--但一如既往--依赖它是一个坏习惯。