裸函数

来源:互联网 发布:常州瑞声科技 知乎 编辑:程序博客网 时间:2024/04/26 14:07

什么是裸函数?在代码中申明函数后,编译时,除了入口参数压栈外,然后就是call这个函数,编译器不会为函数体生成任何代码。

1、普通函数声明如下:int plus2(int a,int b){   return a+b;}2、裸函数声明如下:int __declspec(naked)plus1(int a,int b){}
这是一个普通函数,C++builder反汇编可以看到如下代码:

上图是普通函数,第1部分和第2部分都是编译器生成的代码,并由编译器实现堆栈平衡。

如果是裸函数,函数体为空(只有第一部分),F8单步调试,发现只有参数压栈操作,没有生成相应的call plus1(int,int),紧邻的是plus2的call plus2(int,int),运行后得到错误的结果。

裸函数的运行,必须手动添加相关代码。

int  __declspec(naked) plus1(int a,int b){    __asm    {       mov eax,dword ptr ds:[esp+8]       add eax,dword ptr ds:[esp+4]       ret    }}
因为上面的函数功能比较简单,所以没有提升堆栈的操作。直接从栈中取出两个参数值来相加,结果放在EAX中。
调用时如下:
void __fastcall TForm1::Button16Click(TObject *Sender){   int a = plus1(16,2);}
a能得到正确的结果吗?经测试可以,结果是18

另外可以看出C++builder的优化比VC要好一些,VC有一个堆栈空间分配的操作,然后将分配的空间循环用CC填充,C++builder中没有这个操作。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公司年检过期了怎么办 车检过期一周了怎么办 车检快到期了了怎么办 机动车罚单丢了怎么办 摩托车脱审半年怎么办 摩托车半年没审怎么办 驾照扣分未缴款怎么办 驾驶证过期在外地怎么办 三年驾校过期了怎么办 车年检过期半年怎么办 驾照过期未年检怎么办 驾驶证时间过了怎么办 驾证年审逾期怎么办 驾照a2扣分了怎么办 叉车年检过期了怎么办 部队驾驶证过期了怎么办 车检过期5天怎么办 b2被注销了怎么办 小车逾期未审验怎么办 汽车逾期未审验怎么办 对方无偿还能力怎么办 摩托车驾驶证年审过期怎么办 当兵父亲有前科怎么办 被动态监控了怎么办 学习驾驶证明过期怎么办 a2驾驶证扣分了怎么办 c1驾驶证脱审怎么办 摩托车驾驶证脱审怎么办 行车证到期了怎么办 外省驾驶证掉了怎么办 错过教师证体检怎么办? c3驾驶证怎么办c1证 驾驶证扣分18分怎么办 货车罚款单上没写金额怎么办 报名费驾校不退怎么办 异地学车暂住证怎么办 考驾照老是紧张怎么办 驾照老考不过怎么办 三轮摩托车行驶证怎么办 a2驾驶证附件假背扣怎么办 驾驶证扣分15分怎么办