请帮我解释一下这个汇编:shl eax,0
我写了一个测试内联函数的C++程序,然后反汇编看是否存在函数调用,但是红色这些地方我不是很懂,希望大家帮我看看:
以下是我写的源代码:
#include <iostream>
#include <cmath>
using namespace std;
void boxVolume( int length = 1, int width = 1, int height = 1 );
inline void boxVolume( int length, int width, int height )
{
int vol;
vol = length * width * height;
}
int main()
{
boxVolume();
boxVolume(10);
boxVolume(10,5);
boxVolume(10,5,2);
return 0;
}
主函数内反汇编得到的代码是:
boxVolume();
01151027 mov eax,1
0115102C shl eax,0 我不懂的是这里是左移0位,既然是左移0位,干嘛还要写出了,不是等于不做吗??
0115102F mov dword ptr [ebp-4],eax
boxVolume(10);
01151032 mov ecx,0Ah
01151037 shl ecx,0
0115103A mov dword ptr [ebp-8],ecx
boxVolume(10,5);
0115103D mov edx,0Ah
01151042 imul edx,edx,5
01151045 mov dword ptr [ebp-0Ch],edx
boxVolume(10,5,2);
01151048 mov eax,0Ah
0115104D imul eax,eax,5
01151050 shl eax,1
01151052 mov dword ptr [ebp-10h],eax
[解决办法]
应该是编译器做了优化但又优化不彻底导致的吧,如果不优化,那么就是按步就班做2次乘法,但是这个简单函数被内联展开,再加上你的实参都是编译期常数,它可以做较大的优化,根据实际参数值对原始指令做了删调,但机器不是人,只能按规则行事,总会漏下一些让人类一眼看去就觉好笑的破绽,可以理解
[解决办法]
哪里看debug版本的汇编的, 看了vc和gcc的结果, main都优化成空函数..
稍微改下就看到都优化成常数..
[解决办法]