什么更有效,i ++或++ i?

时间:2009-02-18 15:42:43

标签: java c++ performance post-increment pre-increment

完全重复Is there a performance difference between i++ and ++i in C++?
完全重复Difference between i++ and ++i in a loop?


什么更有效,i ++或++ i?

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

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

20 个答案:

答案 0 :(得分:47)

i ++:

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

++ i:

  • 增加i
  • return i

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

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

答案 1 :(得分:36)

我会在其他地方寻找优化潜力。

答案 2 :(得分:7)

效率不应该是你的关注:它是意思。这两个相同,除非它们是独立的:一个操作值的预先使用,另一个操作。

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

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

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

答案 3 :(得分:5)

在现代编译器上无关紧要。

int v = i++;  

相同
int v = i;
i = i + 1;

现代编译器会发现v未使用,而计算v的代码是纯粹的(没有副作用)。然后它将删除v和分配代码并生成此

i = i + 1;

答案 4 :(得分:3)

这很重要!特别是如果你使用的是C ++ ......

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

你应该总是使用前缀表示法来避免必要的复制开销,而使用C ++这很重要!

答案 5 :(得分:2)

好吧,在C ++中我认为它们有不同的用途,具体取决于你想要更新变量的时间。

效率不应该决定你何时使用另一个,但我认为它们无论如何都会有相同的效率。

答案 6 :(得分:2)

++我可能更有效地实现operator ++的非平凡实现,但即使在那种情况下,编译器也可以优化中间临时。

答案 7 :(得分:2)

++我不需要一个临时变量来存储东西。可以这样想:

++ i的

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;
}

请参阅?后增量需要一个临时变量。假设编译器没有为你排序,几乎可以肯定。

当然,更重要的是程序逻辑;如果你担心这太多,你就有可能遇到The Sad Tragedy of Micro-Optimisation Theatre ... :)

答案 8 :(得分:0)

通常,在C ++中,postfix将需要增加对象的附加构造,而前缀直接应用于对象。 (或者我读过。)

由于我对此事的知识有限,我无法证明编译器如何处理它,因此可以为你处理它使其成为一个没有实际意义的点。

答案 9 :(得分:0)

通常,使用++ i比使用i ++更有效。 原因很简单,就是++ i与

完全相同

i + = 1;

对于x86来说是单指令(可能是大多数其他广泛使用的架构)。 然而,i ++等于

tmp = i; i + = 1;

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

但如上所述,这对于足够聪明的编译器几乎没有影响,因为它会优化未使用的操作。对于许多解释语言(例如:PHP),++ i的速度可能微乎其微;但这种增加可以忽略不计。

答案 10 :(得分:0)

这取决于上下文,例如:

x = i++

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

x = ++i

在这种情况下,'i'将增加1,然后'x'的新值将分配给'x'。

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

答案 11 :(得分:0)

没有正确或错误的答案。

因为它取决于:

  1. 如何由编译器实现。

  2. 系统运行的CPU。

  3. 如果i为字节或i为双字

答案 12 :(得分:0)

输入i ++通常更容易,因此在生产力方面更有效。

但是,严重的是,如果 i 是本机数据类型(例如int,double等) - 没有区别。

如果它是用户定义的类型,例如

,则它是实现依赖的
class Type
{
    Type& operator ++(){}
    const Type& operator ++(int i){}
};  

T i;

答案 13 :(得分:0)

此Stack Overflow问题有一个很好的答案: Is there a performance difference between i++ and ++i in C?

我想补充一点,你应该更好地使用任何一个适合你的需求。除了对应用程序最关键的时候,它并不重要。从学术角度来看,最好编写能够表达所需内容并最终优化的代码。

答案 14 :(得分:0)

一个独立的“i ++;”或“++ i;”应该生成同样有效的代码。如果你在一个表达中使用它会产生差异,“副作用”就会发挥作用。

也就是说,有一段时间,当“全世界都是Vax”和编译器吸吮时,据说++我被认为比i ++更高效,即使在“for(i = 0; i< ; N; ++ i)“类型设置。

答案 15 :(得分:0)

++i速度更快,因为i++必须存储i,然后递增它,然后返回i的存储值。 ++i只需递增i然后返回。

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

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

答案 16 :(得分:0)

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

如果您的应用程序运行缓慢,我可以保证它永远不会是因为整数增量操作的速度差异。如果是,那就是编译器中的一个严重错误。速度 您的应用程序中的问题将是算法效率低下,等待I / O等等。

不要担心你没有的问题。 Premature optimization is the root of all evil

答案 17 :(得分:0)

++我在没有优化的x86汇编中比i ++少了一个处理器指令。

答案 18 :(得分:0)

除非我遗漏了什么,否则它们应该具有相同的效率。它们都应该导致单个添加指令。这只是添加指令发生位置的问题:在代码行的开头或结尾。

答案 19 :(得分:-1)

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

但一般来说,你可以说大致将i ++扩展到以下说明:

COPY i to tmp
INCREMENT tmp
SAVE tmp as i

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

LOAD i
INCREMENT i

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

如果您正在尝试进行这些微观优化,我建议您在选择之前进行描述/测量。