除法运算一般编译成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] ;//
没优化:
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
00EE101F 8B CA mov ecx,edx
00EE1021 C1 E9 1F shr ecx,1Fh ;//EAX = 00000000
00EE1024 03 CA add ecx,edx ;//EAX = 0AC80582
转载于:https://blog.51cto.com/y5023/897883