x + = 1比x = x + 1更有效吗?

时间:2011-09-19 13:41:03

标签: c performance increment

x = x + 1中,x评估两次?如果是这样,那是x += 1x只是评估一次吗?两个表达式如何根据编译器中间代码进行评估?

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

此外,我已经读过x += 1x不是简单变量,而是涉及数组的表达式时非常有用。任何想法为什么会这样?

6 个答案:

答案 0 :(得分:14)

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

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

使用以下标志在达尔文11中使用GCC进行编译:

  • -S停在汇编程序
  • -m32到32位平台,只是为了简化一些事情

除了我添加的注释和空行外,还会生成以下程序。请仔细阅读评论。

        .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

答案 1 :(得分:12)

在大多数编译器中,这些都是相同的

答案 2 :(得分:7)

  

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

不是。

  

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

不是。


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

答案 3 :(得分:3)

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

x=x+1 vs. x +=1

Incrementing: x++ vs x += 1

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

最重要的是,在大多数但不是所有语言中,编译器无论如何都会使它们相同,因此效率没有区别。上面的问题详细介绍了这个问题。

答案 4 :(得分:0)

使用gcc,您可以使用gcc -S foo.c获取汇编程序代码。我尝试使用x += 1x = x + 1并且它是一样的。

答案 5 :(得分:0)

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

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