【问题标题】:Is x += 1 more efficient than x = x + 1?x += 1 是否比 x = x + 1 更有效?
【发布时间】:2011-11-20 06:37:32
【问题描述】:

x = x + 1 中,x 是否被评估了两次?如果是这样,这是否意味着在x += 1 中,x 只评估一次?如何根据编译器中间代码评估这两个表达式?

例如,x++ 可能意味着:获取x 的位置,将x 的内容加载到寄存器中,并在内存中增加x 的值。

我还读到x += 1x 不是简单变量而是涉及数组的表达式时很有用。任何想法为什么会这样?

【问题讨论】:

  • 这听起来像是很多毫无根据的假设,尤其是标题。我看不出一个比另一个更高效的原因,我有理由相信大多数 C 编译器并非如此。
  • 一个物有所值的编译器会将两个表达式编译为相同的目标代码。如果您担心性能:测量,测量不同的代码、不同的编译标志、不同的资源使用情况、不同的一切。
  • 你知道 x += 1 比 x = x + 1 更有效吗?你看过生成的目标代码吗?
  • 找一些17岁以下的书怎么样?
  • 询问 UDT 是一个不同的问题。这个问题是关于 C 的。

标签: c performance increment


【解决方案1】:

只是给你一个“真实世界”的例子,考虑这个程序:

int main()
{
    int i = 0;
    i += 1;
    i++;
    i = i + 1;
    return 0;
}

使用 GCC 编译它,在 Darwin 11 中使用以下标志:

  • -S 停止在汇编器中
  • -m32 到 32 位平台,只是为了简化一点

将生成以下程序,除了我添加的 cmets 和空行。在 cmets 中专门看一看。

        .section        __TEXT,__text,regular,pure_instructions
        .globl  _main
        .align  4, 0x90
_main:
        pushl   %ebp              # cdecl function stuff
        movl    %esp, %ebp        #
        subl    $12, %esp         # get room for variables    
        movl    $0, -12(%ebp)     # i = 0;

        ; i += 1
        movl    -12(%ebp), %eax   # load i in register a
        addl    $1, %eax          # add 1 to register a
        movl    %eax, -12(%ebp)   # store it back in memory

        ; i++
        movl    -12(%ebp), %eax   #
        addl    $1, %eax          # just the same
        movl    %eax, -12(%ebp)   #

        ; i = i + 1
        movl    -12(%ebp), %eax   #
        addl    $1, %eax          # just the same
        movl    %eax, -12(%ebp)   #

        movl    $0, -8(%ebp)
        movl    -8(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        addl    $12, %esp
        popl    %ebp
        ret

.subsections_via_symbols

【讨论】:

  • 我不知道为什么没有将其标记为答案,因为它提供了证据而不仅仅是意见。
  • 这应该被标记为答案。我们还发现其他编译器有什么不同还是遵循相同的模式?
  • @SanVed 谢谢。考虑到编译器的数量,很难说。但是任何具有良好开发的编译器都可能包含这种“智能”。编译器不仅仅是从高到低的直接翻译,它涉及一门完整的科学,像这样的例子是这门科学最基本和最重要的元素之一。所以任何现代和主要的编译器都应该包含它。
【解决方案2】:

在大多数编译器中,它们是相同的

【讨论】:

  • 旧的编译器呢?没有像新的那样优化……为什么它们的评估不同?
  • 如果编译器效率低下,它可能会忽略x被引用两次并加载它,然后对加载的值执行递增操作。
  • 关于数组的评论呢?
  • 再次 - 一个好的编译器将能够生成相同的代码,但效率低下的编译器可能会在处理更复杂的表达式(例如涉及数组成员的表达式)时遇到更多麻烦
【解决方案3】:

为什么 x += 1 比 x = x+1 更有效?

不是。

为什么 x++ 比 x += 1 更有效?

不是。


之所以首选x += 1 而不是x = x+1 是因为x 被替换为更长的标识符,或者可能是类或结构中的字段。在这种情况下,x += 1 版本更具可读性,更重要的是避免了重复自己的陷阱。

【讨论】:

    【解决方案4】:

    所以已经有一些问题涵盖了您在这里提出的问题:

    x=x+1 vs. x +=1

    Incrementing: x++ vs x += 1

    Which is faster? ++, += or x + 1?

    最重要的是,在大多数但不是所有语言中,编译器无论如何都会使它们相同,因此效率没有差异。上面的问题对这个主题有相当多的细节。

    【讨论】:

      【解决方案5】:

      使用 gcc,您可以使用 gcc -S foo.c 获取汇编代码。我用x += 1x = x + 1 试了一下,结果是一样的。

      【讨论】:

        【解决方案6】:

        因为它需要 4 个字符而不是 5 个字符。

        这是x+=1x=x+1“更有效”的唯一方法。然而,+= 运算符确实具有其他一些优点,例如 (x)+=1 在宏中工作,其中 x 是一个可能有副作用的表达式,您希望避免多次评估......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-02
          • 1970-01-01
          • 2016-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-04
          相关资源
          最近更新 更多