内联函数的高效性,没有看懂
一般书上都是提一些, 理论性的东西,比如:内联函数不需要保存返回地址, 节省空间,32位平台,函数地址就是4字节。。。
不需要跳转到函数代码哪里,所以节省时间。。。
c++反汇编书 这一本书,挖掘底层的书,作者说,希望用汇编来 挖掘出 内联函数和普通函数的区别所在:
- C/C++ code
inline void f(){ int i=0; i++;}void f2(){ int i=0; i++;}int _tmain() { f2(); f();; return 0;}
//这里是返汇编, 在下眼拙, 没有看出 内联和普通函数的区别所在:
void f2()
{
000A13B0 push ebp
000A13B1 mov ebp,esp
000A13B3 sub esp,0CCh
000A13B9 push ebx
000A13BA push esi
000A13BB push edi
000A13BC lea edi,[ebp-0CCh]
000A13C2 mov ecx,33h
000A13C7 mov eax,0CCCCCCCCh
000A13CC rep stos dword ptr es:[edi]
int i=0;
000A13CE mov dword ptr [i],0
i++;
000A13D5 mov eax,dword ptr [i]
000A13D8 add eax,1
000A13DB mov dword ptr [i],eax
}
inline void f()
{
000A1450 push ebp
000A1451 mov ebp,esp
000A1453 sub esp,0CCh
000A1459 push ebx
000A145A push esi
000A145B push edi
000A145C lea edi,[ebp-0CCh]
000A1462 mov ecx,33h
000A1467 mov eax,0CCCCCCCCh
000A146C rep stos dword ptr es:[edi]
int i=0;
000A146E mov dword ptr [i],0
i++;
000A1475 mov eax,dword ptr [i]
000A1478 add eax,1
000A147B mov dword ptr [i],eax
}
[解决办法]
现在的编译器不需要你写inline也会内联,与此同时,编译不开速度优化开关就算你写inline也不给你内联
[解决办法]
你是走直线还是拐弯路的路程短呢?
[解决办法]
从函数f的反汇编代码是看不出来的,应该看main函数的反汇编代码,
inline是指嵌入代码,就是在调用函数的地方不跳转,而是把代码直接嵌入到调用的地方,因而在main函数调用该函数的地方不会出现call xxx这样的语句
[解决办法]
你得看main里的反汇编有无call,不能看函数
而且和你的编译开关和编译器判断有关
[解决办法]
Release 下,编译器判断出你的函数不影响输出,所以优化掉了。
[解决办法]
main中的call可能是调用f2,因为f2不是inline函数,你把main函数反汇编代码贴出来看看