程序员面试宝典》上说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页也有说明。