根据Google C++ Style Guide,“当忽略返回值时,'pre'表单(++i
)的效率永远不会低于'post'表单(i++
),并且通常更有效率。“
指南继续解释原因,但我并不完全明白。思考?也许有人可以提供这个概念的例子吗?
答案 0 :(得分:11)
i++
递增i
并返回i
的初始值。这意味着:
int i = 1;
i++; // == 1 but i == 2
但++i
返回实际递增的值:
int i = 1;
++i; // == 2 and i == 2 too, so no need for a temporary variable
在第一种情况下,编译器必须创建一个临时变量(在使用时)以返回1
而不是2
(在它不是常量但是动态值的情况下,例如,从电话回来。)
在第二种情况下,它不必。所以第二种情况保证至少同样有效。
通常,编译器能够将第一种情况优化为第二种情况,但有时可能无法实现。
无论如何,我们谈论的影响是微不足道的。
但是对于更复杂的对象,例如像iterators
这样的对象,如果迭代数百万次,那么具有临时状态可能会相当慢。
经验法则
除非您特别需要后缀语义,否则请使用前缀版本。
答案 1 :(得分:2)
引自:
http://www.parashift.com/c++-faq/increment-pre-post-speed.html
++我有时比i ++更快,并且永远不会慢。
对于像int这样的内部类型,没关系:++ i和i ++的速度相同。对于像迭代器这样的类类型,++我可能比i ++更快,因为后者可能会复制这个对象。
i ++的开销,如果它完全存在,除非你的应用程序受CPU限制,否则不会产生任何实际差异。例如,如果您的应用程序花费大部分时间等待某人点击鼠标,执行磁盘I / O,网络I / O或数据库查询,那么浪费几个CPU周期就不会影响您的性能。然而,输入++ i和i ++一样容易,所以为什么不使用前者,除非你真的需要i的旧值。
因此,如果您将i ++作为一个语句而不是作为更大表达式的一部分来编写,那么为什么不编写++ i呢?你永远不会失去任何东西,你有时会获得一些东西旧的C语言程序员习惯于编写i ++而不是++ i。例如,他们会说,
for (i = 0; i < 10; i++) ....
由于这使用i ++作为语句,而不是作为更大表达式的一部分,因此您可能希望使用++ i代替。对于对称性,我个人提倡这种风格,即使它没有提高速度,例如,对于内部类型和具有返回void的后缀运算符的类类型。
答案 2 :(得分:0)
i ++ - 使用i后,该值会增加 ++ i - 值立即递增。
可能存在性能差异,因为++ i要求我立即增加,周期。 i ++继续建议我在增加之前可能需要它。该值可以在递增之前存储在某处。
答案 3 :(得分:0)
递增(或递减)运算符涉及两个操作:递增并根据表达式取两个值(旧的或新的)中的一个。不同之处在于采取哪种方式。
如果您选择预表格,则首先递增,然后取值,即新表格。
在你对帖子进行故事编写时,你取旧值,保留它,增加它,将新值放入旧位置并返回旧位置。这听起来更复杂 - 而且确实如此。
但是如果忽略表达式的返回值,那么无论你有内置类型还是对象,它都应该没有任何区别。
答案 4 :(得分:0)
对于迭代器和其他模板类型,请使用预增量。
答案 5 :(得分:0)
这是因为当你增加后,你必须:
只需要保留该变量的两个副本,复制和删除就需要额外的时间......