执行速度之间n/=10
有什么区别吗?n=n/10
就像n--
并且--n
在执行速度方面也有所不同......
不,不是真的:
[C99: 6.5.16.2/3]:
形式的复合赋值E1 op= E2
与简单赋值表达式的不同之处E1 = E1 op (E2)
仅在于左值E1
只计算一次。
因此,仅当您n
是具有副作用的非平凡表达式(例如函数调用)时,这才会产生后果。
否则,我想理论上会涉及一个中间临时变量,但你必须非常不幸,这样一个临时变量才能在你编译的可执行文件中真正存在。您不会看到这两种方法之间的任何性能差异。
用基准确认这一点,并通过比较生成的程序集。
给定以下 C 代码:
int f1(int n) {
n /= 10;
return n;
}
int f2(int n) {
n = n / 10;
return n;
}
编译的gcc -O4
结果基本上是
f1:
movl %edi, %eax
movl $1717986919, %edx
sarl $31, %edi
imull %edx
sarl $2, %edx
subl %edi, %edx
movl %edx, %eax
ret
f2:
movl %edi, %eax
movl $1717986919, %edx
sarl $31, %edi
imull %edx
sarl $2, %edx
subl %edi, %edx
movl %edx, %eax
ret
我省略了一些样板文件,这些样板文件实际上是列表的一部分。
在这种特定情况下,两种选择之间没有区别。
根据使用的编译器、执行指令的实际环境和编译器优化级别,生成的代码可能会有所不同。但是您始终可以使用这种方法来检查生成的机器代码是否不同。
两者没有区别。
我已经在 KEIL 交叉编译器中检查了这两个表达式和所需的相同执行时间:
=================================================
5: x=x/5;
6:
C:0x0005 EF **MOV A,R7**
C:0x0006 75F005 **MOV B(0xF0),#0x05**
C:0x0009 84 **DIV AB**
7: x/=5;
C:0x000A 75F005 **MOV B(0xF0),#0x05**
C:0x000D 84 **DIV AB**
C:0x000E FF **MOV R7,A**
================================================
因此,没有任何区别,例如--n
和n--
。