程序员面试宝典》上说n++高过n=n+1,貌似有道理。但效率不是你我说了算,而应该由编译器说了算。
测试源代码如下:
int main(void)
{
int n = 20;
n++;
++n;
n=n+1;
n+=1;
return 0;
}
VC++6.0的汇编代码如下:
9: int n = 10;
0040D781 mov dword ptr [ebp-1Ch],0Ah
10: ++n;
0040D788 mov ecx,dword ptr [ebp-1Ch]
0040D78B add ecx,1
0040D78E mov dword ptr [ebp-1Ch],ecx
11: n++;
0040D791 mov edx,dword ptr [ebp-1Ch]
0040D794 add edx,1
0040D797 mov dword ptr [ebp-1Ch],edx
12: n += 1;
0040D79A mov eax,dword ptr [ebp-1Ch]
0040D79D add eax,1
0040D7A0 mov dword ptr [ebp-1Ch],eax
13: n = n + 1;
0040D7A3 mov ecx,dword ptr [ebp-1Ch]
0040D7A6 add ecx,1
0040D7A9 mov dword ptr [ebp-1Ch],ecx
DEV-C++汇编代码如下:
movl $20, -4(%ebp)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
现象:2个编译器对四条语句的汇编都是一样的,区别在于VC6用了3条汇编语句,而G++用了2条。
结论:
四条语句在某个具体的编译器环境中的实际效率是一样的,但不同的编译器实现又会有不同,如G++的效率,至少在这条语句的汇编上可以看出,比V6的高一点。
注:关于这个现象在《C专家编程》的P276页也有说明。
本文通过对比VC++6.0与DEV-C++编译器对相同C语言代码的不同汇编优化,展示了两种编译器在处理n++、++n、n=n+1及n+=1等操作时的细微差别。实验表明,尽管最终效果一致,但在具体实现上存在差异。

3915

被折叠的 条评论
为什么被折叠?



