n/=10和n=n/10在执行速度方面有什么不同吗?
就像n--和--n在执行速度上的不同一样...
发布于 2013-04-08 20:54:55
不,不是真的:
[C99: 6.5.16.2/3]:形式的复合赋值与简单赋值表达式E1 = E1 op (E2)的唯一不同之处在于,左值E1只计算一次。
因此,只有当您的n是一个具有副作用(如函数调用)的非平凡表达式时,这才会产生后果。
否则,我认为在理论上会涉及到一个中间临时变量,但你必须非常不幸,这样的临时变量才能在编译后的可执行文件中真正存在。您将不会看到这两种方法之间的任何性能差异。
通过基准测试和比较生成的程序集来确认这一点。
发布于 2013-04-08 20:59:18
给定以下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我省略了一些样板文件,它实际上是清单的一部分。
在此特定情况下,两个替代方案之间没有区别。
根据所使用的编译器、执行指令的实际环境和编译器优化级别,生成的代码可能会有所不同。但是,您可以始终使用此方法来检查生成的机器码是否不同。
发布于 2013-04-08 22:51:14
b/w两者没有区别。
https://stackoverflow.com/questions/15879388
复制相似问题