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

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

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

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

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

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

 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 

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

事实并非如此。

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

事实并非如此。


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

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

x = x + 1对x + = 1

递增:x ++ vs x + = 1

哪个更快? ++,+ =或x + 1?

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

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

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

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