什么是更有效的i ++或++我?

精确重复 : 在C ++中,i ++和++ i之间是否存在性能差异?
完全重复 : 在循环中的i ++和++之间的区别?


什么是更有效的i ++或++我?

我只在Java和C / C ++中使用过,但是我确实要求所有的语言都是这样实现的。

在大学里,我有一位教授向我们展示了++,我的效率更高,但已经有几年了,我想从SO社区获得意见。

我++:

  • 创build我的临时副本
  • 增加i
  • 返回临时副本

++ i:

  • 增加i
  • 回报我

通过优化,生成的程序集很可能是相同的,但++ i更高效。

编辑:请记住,在C ++中,我可能是任何支持前缀和后缀++运算符的对象。 对于复杂的对象,临时复制成本是不可忽略的。

我会寻找其他优化的潜力。

这是什么思考的C + +前缀与后缀增量

效率不应该是你关心的问题:它是有意义的 。 两者一样,除非它们是独立的:一个是运用价值的预先使用,另一个是岗位。

int i; 我= 1; cout << i ++; //返回1

int i; 我= 1; cout << ++ i; //返回2

当意义不重要时,大多数编译器会将++ i和i ++(比如for循环)转换成相同的机器/ VM代码。

现代编译器无关紧要。

int v = i++; 

是相同的

 int v = i; i = i + 1; 

一个现代的编译器会发现v被使用,计算v的代码是纯的(没有副作用)。 然后它会删除v和赋值代码,并会生成这个

 i = i + 1; 

这很重要! 特别是如果你在C ++ …

 ++i // the prefered way, unless.. auto j = i++ // this is what you need 

你应该总是使用前缀符号,以避免必要的复制开销,并与C + +重要!

那么在C ++中,我相信他们有不同的用途,取决于什么时候你想variables更新。 效率不应该决定什么时候使用一个,但我会认为他们会有同样的效率。

++对于operator ++的非平凡实现来说,我可能更有效率,但即使在这种情况下,编译器也可能能够优化中间临时性。

++我不需要一个临时variables来存储东西。想想他们是这样的:

++我

 int preIncrement(int i) { i = i + 1; return i; } 

我++

 int i = 5; // as an example int postIncrement(_i) { int temp = _i; i = _i + 1; return temp; } 

看到? 后增加需要一个临时variables。 假设编译器不会为你sorting,几乎可以肯定的。

当然,更重要的是程序逻辑; 如果你担心这个太过分了,那么你就会冒险遇到微型优化剧院的伤心悲剧 …… 🙂

除非我错过了一些东西,否则它们应该有相同的效率。 他们都应该导致一个单一的添加指令。 这只是添加指令发生的地方:在代码行的开头或结尾。

没有区别。 使用最有意义的构造。

如果您的应用程序运行缓慢,我可以保证,它不会因为整数增量操作中的速度差异。 如果是这样,这是编译器中的一个严重错误。 应用程序中的速度问题将会导致algorithm效率低下,等待IO等等。

不要担心你没有的问题。 不成熟的优化是万恶之源。

++i更快,因为i++必须存储i ,然后增加它,然后返回存储的值i++i只是增加i然后返回它。

 // ++i i += 1; return i; // i++ temp = i; i += 1; return temp; 

独立的“i ++” 或“++我”; 应该生成同样有效的代码。 如果在“副作用”发挥作用的expression式中使用它,则会有所不同。

也就是说,有一段时间,当“世界上所有的Vax”和编译器都被吸引了,那++还是被说成是i ++更高效的,即使在“for(i = 0; i <N; + + i)“types设置。

这个stackoverflow的问题有一个很好的答案: 是否有性能差异之间的C + +我在i + +?

我想补充一点,你应该使用哪一个更适合你的需求。 除了最重要的应用程序,这并不重要。 从学术的angular度来看,最好还是编写一些代码来expression你所需要的,最后再进行优化。

没有对错的答案

这取决于

1)编译器是如何实现的

2)系统运行的是哪个Cpu

3)如果我是字节或我双字

一般来说,使用++ i比i ++更有效率。 这个简单的原因是++我完全一样

i + = 1;

对x86来说这是一个单一的指令(可能是大多数其他广泛使用的体系结构)。 然而我++是相等的

tmp = i; i + = 1;

那是因为'我'的旧价值是我++评估的东西。 显然,这需要更多的工作,而不是简单的i + = 1;

但是如上所述,这对于一个足够聪明的编译器几乎没有影响,因为它会优化未使用的操作。 对于许多解释型语言(例如:PHP)来说,++ i可能只有极小的速度增益; 但是这个增长是微不足道的。

一般来说,在c ++中,postfix将需要增加对象的附加构造,而prefix则直接应用于对象。 (或者我读过)

由于我对这个问题知之甚less,因此我无法certificate编译器是如何处理这个问题的,所以可以把它解决,使它成为一个有争议的问题。

++我需要1个较less的处理器指令比i ++在x86汇编没有优化

inputi ++通常更容易,因此在生产时间方面效率更高。

不过,严重的是,如果是一个本地数据types(如int,double等) – 没有区别。

如果它是一个用户定义的types如

 class Type { Type& operator ++(){} const Type& operator ++(int i){} }; T i; 

它取决于上下文,例如:

 x = i++ 

在这种情况下,'x'将等于'i',只有在'i'之后才会增加1。

 x = ++i 

在这种情况下,'i'将增加1,然后'x'的新值将被赋予'x'。

在“for”循环的情况下,除了性能之外几乎没有明显的区别(++ i更快)。

这很难回答这个问题,因为它取决于编译器/解释器的实现。

但总的来说,你可以粗略地将i ++扩展为以下指令:

 COPY i to tmp INCREMENT tmp SAVE tmp as i 

虽然++我会大致延伸到:

 LOAD i INCREMENT i 

你不能只是说++我比i ++更快,因为语言实现非常聪明,当你知道你不会访问i ++的临时值时,他们可以优化这些指令。 这通常发生在一个for循环中。 所以在许多情况下,它是一样的。

如果你正试图进行这种微观优化,我build议你在select一个之前进行简介/测量。