代码之家  ›  专栏  ›  技术社区  ›  Berek Bryan

i++或++i,什么更有效?[副本]

  •  15
  • Berek Bryan  · 技术社区  · 17 年前

    精确副本 : Is there a performance difference between i++ and ++i in C++?
    精确副本 : Difference between i++ and ++i in a loop?


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

    20 回复  |  直到 7 年前
        1
  •  49
  •   Edouard A.    17 年前

    i++:

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

    ++一:

    • 增量i
    • 返回i

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

        2
  •  37
  •   Tor Haugen    17 年前

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

        3
  •  7
  •   Godeke    17 年前

    效率不应该是你关心的问题:它是 意思 同样,除非它们是独立的:一个操作值的使用前,另一个操作后。

    int i; 库特<&书信电报;i++//返回1

    int i; i=1; 库特<<++一,//返回2

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

        4
  •  5
  •   Ted    17 年前

    这在现代编译器上并不重要。

    int v = i++;  
    

    int v = i;
    i = i + 1;
    

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

    i = i + 1;
    
        5
  •  3
  •   John Leidegren    5 年前

    这很重要!特别是如果你在C++的土地上使用自定义迭代器协议…

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

        6
  •  2
  •   Jim Buck    17 年前

    ++对于运算符++的非平凡实现,i可能更有效,但即使在这种情况下,编译器也可能能够优化中间临时值。

        7
  •  2
  •   Rob Grant    13 年前

    ++我不需要临时变量来存储内容。你可以这样想:

    ++我

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

    看见Postincrement需要一个临时变量。假设编译器没有为您将其全部分类,这几乎可以肯定。

    当然,更重要的是程序逻辑;你冒着遇到的风险 The Sad Tragedy of Micro-Optimisation Theatre 如果你对此过于担心……:)

        8
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    在C++中,我相信它们有不同的用途,这取决于你想要变量更新的时间。

    效率不应该决定你什么时候使用一种方法而不是另一种方法,但我认为无论哪种方法,它们的效率都是一样的。

        9
  •  0
  •   Steve Rowe    17 年前

    除非我遗漏了什么,否则它们应该有同样的效率。它们都应产生一条add指令。这只是add指令发生在哪里的问题:在代码行的开头还是结尾。

        10
  •  0
  •   Paige Ruten    17 年前

    ++i i++ 必须存储 i ,然后递增,然后返回 ++我 简单地增加

    // ++i
    i += 1;
    return i;
    
    // i++
    temp = i;
    i += 1;
    return temp;
    
        11
  •  0
  •   Paul Tomblin    17 年前

    独立的“i++;”或“++i;”应该生成同样高效的代码。如果你在一个表达式中使用它,“副作用”就起作用了,区别就来了。

    也就是说,曾经有一段时间,当“全世界都是Vax”的时候,编译器很糟糕,人们说++i比i++更高效,即使是在“for(i=0;i<N;+++i)”类型设置中。

        12
  •  0
  •   Zuu    17 年前

    一般来说,使用++i比使用i++更有效。 原因很简单,++i与

    i+=1;

    然而,i++等于

    tmp=i;i+=1;

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

        13
  •  0
  •   strager    17 年前

    输入i++通常比较容易,因此在生产时间方面效率更高。

    说真的,如果 是本机数据类型(如int、double等)——没有区别。

    class Type
    {
        Type& operator ++(){}
        const Type& operator ++(int i){}
    };  
    
    T i;
    
        14
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    ++在x86汇编中,在没有优化的情况下,我使用的处理器指令比i++少一条。

        15
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

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

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

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

        16
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    Is there a performance difference between i++ and ++i in C?

    我想补充一点,你应该选择更适合你需要的。除了在时间最关键的应用程序中,它并不重要。同样从学术角度来看,最好编写能够表达您需要的代码,并最终进行优化。

        17
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    答案没有对错之分。

    这取决于:

    1. 编译器是如何实现的。

    2. 系统运行在什么CPU上。

    3. 如果 i 是字节还是 是双字

        18
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    这取决于上下文,例如:

    x = i++
    

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

    x = ++i
    

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

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

        19
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

        20
  •  -1
  •   Johan Dahlin Idelic    17 年前

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

    但一般来说,您可以大致将i++扩展到以下指令:

    COPY i to tmp
    INCREMENT tmp
    SAVE tmp as i
    

    LOAD i
    INCREMENT i
    

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