为什么++ i比i ++更有效?

时间:2013-04-03 04:21:12

标签: c++ for-loop while-loop do-while

根据Google C++ Style Guide,“当忽略返回值时,'pre'表单(++i)的效率永远不会低于'post'表单(i++),并且通常更有效率。“

指南继续解释原因,但我并不完全明白。思考?也许有人可以提供这个概念的例子吗?

6 个答案:

答案 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)

这是因为当你增加后,你必须:

  1. 同时更改值
  2. 将旧值分配给其他内容。
  3. 只需要保留该变量的两个副本,复制和删除就需要额外的时间......

相关问题