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

Why is ++i more efficient than i++?

本文关键字:高效 i++ ++i 为什么      更新时间:2023-10-16

根据Google c++风格指南,"当返回值被忽略时,'pre'形式(++i)的效率绝不会低于'post'形式(i++),而且通常效率更高。"

导游继续解释原因,但我不太明白。想法吗?也许有人可以提供一个这个概念的例子?

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类对象,如果迭代数百万次,拥有临时状态可能会相当慢。

经验法则

使用前缀版本,除非你特别想要后缀语义

引用自:

http://www.parashift.com/c + + faq/increment-pre-post-speed.html

++i有时比i++快,但从来不会比i++慢。

对于像int这样的固有类型,这无关紧要:++i和i++是相同的速度。对于像迭代器这样的类类型,++i很可能比i++快,因为后者可能会复制this对象。

i++的开销,如果有的话,可能不会有任何实际的区别,除非你的应用是CPU限制。例如,如果你的应用程序花费大部分时间等待某人点击鼠标、执行磁盘I/O、网络I/O或数据库查询,那么浪费一些CPU周期不会影响你的性能。然而,输入++i和i++一样容易,所以为什么不使用前者呢?除非你确实需要i的旧值。

所以如果你把i++写成一个语句,而不是一个更大的表达式的一部分,为什么不直接写++i呢?你永远不会失去任何东西,有时还会得到一些东西。老的C程序员习惯于写i++而不是++i。例如,他们会说

for (i = 0; i < 10; i++) .... 

由于这将i++用作语句,而不是更大表达式的一部分,因此您可能希望使用++i。对于对称性,我个人提倡这种风格,即使它不能提高速度,例如,对于内部类型和带有返回void的后缀操作符的类类型。

i++ -使用i后值递增++i -值立即加1

可能会有性能差异,因为++i要求立即增加i,句号。i++继续建议,在它被增加之前可能需要I。该值可能在增加之前存储在某个地方。

自增(或自减)操作符涉及两个操作:自增和取两个值(旧值或新值)中的一个作为表达式的结果。差别在于该选哪一个。

如果取前置形式,则先自增,然后取新值。

如果您使用post-form,则取旧值,保留它,增加它,将新值放入旧位置并返回旧值。这听起来更复杂——事实也是如此。

但是,如果表达式的返回值被忽略,则无论您使用的是内置类型还是对象,都不会有任何区别。

对于迭代器和其他模板类型,使用预增量

这是因为当您进行后增量操作时,您必须:

  1. 改变值,同时
  2. 将旧值赋给其他值

简单地说,您必须保留该变量的两个副本,并且复制和删除是需要额外时间的…