乘法优化
说明:乘法和加减法相比,优化的可能性就高了很多了,主要是因为计算机对于乘法的运算速度不如加减法或者移位运算,所以如果可以转换成简单加减法和移位运算的乘法,编译器就可以选择不使用乘法,而用加减法+移位运算代替。
额外知识点:
- 移位运算,左移和乘2的n次方结果一样,右移分为算术右移和逻辑右移,分别对应右移时左补位补的是符号位还是0。(算术右移补符号位,逻辑右移补0)可以简单理解为算术右移针对有符号数,逻辑右移针对无符号数。
- 乘法的汇编指令,包括imul和mul,imul是有符号数,mul为无符号数。
1 变量乘常量,常量为2的幂
说明:由于乘2的幂相当于左移,所以可以使用左移代替乘2的幂。
示例:
void test(int arg)
{
printf("val = %d\n", arg * 16);
}
//对于arg * 16,汇编翻译,设arg存放在ebp - 4;
//mov eax, dword ptr [ebp - 4]
//shl ea