3

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

该指南继续解释原因,但我并不完全理解。想法?也许有人可以提供这个概念的例子?

4

6 回答 6

13

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-like 对象,如果迭代数百万次,具有临时状态可能会非常慢。

经验法则

除非您特别想要后缀语义,否则请使用前缀版本。

于 2013-04-03T04:25:12.020 回答
2

引用自:

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 的后缀运算符的类类型。

于 2013-04-03T04:25:24.250 回答
0

i++ - 使用 i 后值递增 ++i - 值立即递增。

可能存在性能差异,因为 ++i 要求 i 立即递增,期间。i++ 继续建议在增加之前可能需要 i 。该值可能会在增加之前存储在某处。

于 2013-04-03T04:25:34.543 回答
0

递增(或递减)运算符涉及两个操作:递增和取两个值(旧值或新值)之一作为表达式的结果。区别在于拿哪一个。

如果您采用预制件,您首先增加然后采用新的值。

在你讲述后表单时,你获取旧值,保留它,增加它,将新值放入旧位置并返回旧值。这听起来更复杂 - 确实如此。

但是如果表达式的返回值被忽略,它应该没有任何区别,不管你有一个内置的类型还是一个对象。

于 2013-04-03T04:25:53.067 回答
0

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

于 2013-04-03T04:26:06.960 回答
0

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

  1. 更改值并同时
  2. 将旧值分配给其他东西。

只需保留该变量的两个副本,而复制和删除需要额外的时间......

于 2013-04-03T04:26:21.583 回答