VC++编译器对整数除法的优化

除法运算一般编译成div 、idiv指令,运算的代价相当高,大约比乘法多消耗10倍CPU时钟,除数未知数用div指令,程序执行效率下降。除数是2的幂可以用移位指令shr a,n  ,有符号计算用sar。一般各种计算机语言的编译器都会优化用乘法运算来取代除法运算。看VC++2010优化和没有优化的反汇编。a / b = a X 1/a    。
没优化:
cout<<a/10;
00341497     8B 45 F8                     mov         eax,dword ptr [a] 
0034149A     99                              cdq                 ;/////////把eax扩展位4字(32位)
0034149B     B9 0A 00 00 00         mov         ecx,0Ah 
003414A0     F7 F9                         idiv        eax,ecx       ;////////a/10

003414A2     8B F4                         mov         esi,esp 
003414A4     50                               push        eax 

优化后:
cout<<a/10;
00EE1014     B8 67 66 66 66          mov         eax,66666667h      ;//EAX 根据除数生成
00EE1019     F7 6D FC                  imul        dword ptr [a]    ;//
 00EE101C     C1 FA 02                 sar          edx,2                ;//  EDX = 0AC80582
00EE101F     8B CA                       mov         ecx,edx 
00EE1021     C1 E9 1F                   shr         ecx,1Fh              ;//EAX = 00000000
00EE1024     03 CA                        add         ecx,edx              ;//EAX = 0AC80582

你可能感兴趣的:(vc++,编译器)