a=100,b=50,n为测试变量
start=clock();
for(i=1;i<=n;i++)
{
}
end=clock();
cout << "Time= "<<end-start<<endl;
for(i=1;i<=n;i++)
{
}
以下分别是If-else与三目运算的汇编代码。
37: if(a>b)
00401079 mov ecx,dword ptr [ebp-10h]
0040107C cmp ecx,dword ptr [ebp-14h]
0040107F jle main+79h (00401089)
38: temp=a;
00401081 mov edx,dword ptr [ebp-10h]
00401084 mov dword ptr [ebp-18h],edx
39: else
00401087 jmp main+7Fh (0040108f)
40: temp=b;
00401089 mov eax,dword ptr [ebp-14h]
0040108C mov dword ptr [ebp-18h],eax
51: temp=a>b?a:b;
004010F3 mov edx,dword ptr [ebp-10h]
004010F6 cmp edx,dword ptr [ebp-14h]
004010F9 jle main+0F3h (00401103)
004010FB mov eax,dword ptr [ebp-10h]
004010FE mov dword ptr [ebp-24h],eax
00401101 jmp main+0F9h (00401109)
00401103 mov ecx,dword ptr [ebp-14h]
00401106 mov dword ptr [ebp-24h],ecx
00401109 mov edx,dword ptr [ebp-24h]
0040110C mov dword ptr [ebp-18h],edx
然后根据这原理,可以知道 ++i 比 i++ 快, x+=y 比 x=x+y 快。
不过,我们写程序的时候可以忽略它们,因为这种东西,编译器已经帮我们优化了!!!
所以不管你写 i++ 还是 ++i ,它都是一样的 ,以下是证明。
00401048 mov dword ptr [ebp-4],1
32:
33: ++i;
0040104F mov eax,dword ptr [ebp-4]
00401052 add eax,1
00401055 mov dword ptr [ebp-4],eax
34:
35: i++;
00401058 mov ecx,dword ptr [ebp-4]
0040105B add ecx,1
0040105E mov dword ptr [ebp-4],ecx
以下是常量的汇编代码。 确实没有跳转指令 将1:0换成其他数字,经测试也是没有,虽然指令会多了几条。
38: z=x>y?1:0;
0040106E mov ecx,dword ptr [ebp-8]
00401071 xor edx,edx
00401073 cmp ecx,dword ptr [ebp-0Ch]
00401076 setg dl
00401079 mov dword ptr [ebp-4],edx