首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

内联函数的高效性,没有看懂,该如何解决

2012-03-20 
内联函数的高效性,没有看懂一般书上都是提一些, 理论性的东西,比如:内联函数不需要保存返回地址, 节省空间

内联函数的高效性,没有看懂
一般书上都是提一些, 理论性的东西,比如:内联函数不需要保存返回地址, 节省空间,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函数反汇编代码贴出来看看

热点排行