版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——用汇编的眼光看c(之模板函数)软件英才网软件行业著名聘请网站
用汇编的眼光看
c++(之模板函数)
假使说模板类定义的是一种数据类型,那么模板函数定义的就是一种函数。既然是函数,那么就有输入数据和输出数据。和模板类的概念差不多,模板函数的初衷也是为了在函数操作上抽取共同的特性,屏蔽的是类型的不同和差异。我们可以通过下面一个简单的代码说明问题:
?????????
intint_compare(inta,intb){
returna>b?a:b;}
doubledouble_compare(doublea,doubleb){
returna>b?a:b;}
??template??typecompare(typea,typeb)??{
??returna>b?a:b;??}
??246:inti_value=compare(2,3);??00401458push3??0040145Apush2
??0040145Ccall@ILT+10(compare)(0040100f)??00401461addesp,8
??00401464movdwordptr[ebp-4],eax??247:doubled_value=compare(2.3,3.1);??00401467push4008CCCCh??0040146Cpush0CCCCCCCDh??00401471push40026666h??00401476push66666666h
??0040147Bcall@ILT+5(compare)(0040100a)??00401480addesp,10h
??00401483fstpqwordptr[ebp-0Ch]有需要请联系我们软件英才网软件行业著名聘请网站
??248:}
汇编代码说明,两个compare调用的函数地址并不是一致的。其中整数的compare地址是0x40100f,而double的地址是0x0040100a。这说明编译器在编译的时候帮我们同时生成了两个compare函数。所以说,模板类的本质就是在编译器增加判断处理工作的同时,减少手工的重复劳动。同时和模板类不一样,模板函数不需要显示定义函数的参数类型,这是由于可以从入参判断出函数的类型。假使参数类型是class类型呢?我们可以试一试。首先定义基本class:
??classdata??{
??intvalue;??public:
??explicitdata(intm):value(m){}??~data(){}
??intget_value(){returnvalue;}
??intoperator>(data}??};
??256:datam(4),n(2);??0040148Dpush4
??0040148Fleaecx,[ebp-10h]
??00401492call@ILT+40(data::data)(0040102d)??00401497movdwordptr[ebp-4],0??0040149Epush2
??004014A0leaecx,[ebp-14h]
??004014A3call@ILT+40(data::data)(0040102d)??004014A8movbyteptr[ebp-4],1??257:datap=compare(m,n);
??004014ACmoveax,dwordptr[ebp-14h]??004014AFpusheax
??004014B0movecx,dwordptr[ebp-10h]??004014B3pushecx
??004014B4leaedx,[ebp-18h]??004014B7pushedx
??004014B8call@ILT+15(compare)(00401014)??004014BDaddesp,0Ch??258:}
256行:data构造了两个基本变量m和n257行:我们调用模板函数compare,有需要请联系我们软件英才网软件行业著名聘请网站
函数地址为0x401014,注意dx为p的地址,也就是堆栈临时变量的地址为了看到算术符>重载,我们跟进compare函数:
??241:returna>b?a:b;??0040212Bleaeax,[ebp+10h]??0040212Epusheax
??0040212Fleaecx,[ebp+0Ch]
??00402132call@ILT+55(data::operator>)(0040103c)??00402137testeax,eax
??00402139jecompare+53h(00402143)??0040213Bleaecx,[ebp+0Ch]
??0040213Emovdwordptr[ebp-18h],ecx??00402141jmpcompare+59h(00402149)??00402143leaedx,[ebp+10h]
??00402146movdwordptr[ebp-18h],edx??00402149moveax,dwordptr[ebp-18h]??0040214Cmovdwordptr[ebp-10h],eax??0040214Fmovecx,dwordptr[ebp-10h]??00402152movedx,dwordptr[ecx]??00402154moveax,dwordptr[ebp+8]??00402157movdwordptr[eax],edx??00402159movecx,dwordptr[ebp-14h]??0040215Corecx,1
??0040215Fmovdwordptr[ebp-14h],ecx??00402162movbyteptr[ebp-4],1??00402166leaecx,[ebp+0Ch]
??00402169call@ILT+25(data::~data)(0040101e)??0040216Emovbyteptr[ebp-4],0??00402172leaecx,[ebp+10h]
??00402175call@ILT+25(data::~data)(0040101e)??0040217Amoveax,dwordptr[ebp+8]
我们发现compare模板语句下面构建了好多汇编语句,有一些冗长,我们可以大致介绍一下:(1)开头调用call0x0040103C函数就是调用重载运算符函数,[ebp-18h]表示即将被复制的是a数据还是b数据
(2)比较返回结果后,开始复制数据,具体见0x402157,其中临时变量[ebp-14h]和临时变量[ebp-4]的操作可以忽略
(3)函数返回前,对临时变量a和b进行析构处理,见代码0x402169和代码0x402175。有需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年东营市事业单位人员招聘考试备考试题及答案详解
- 2026年昌吉市新闻系统事业单位人员招聘考试备考试题及答案详解
- 2026福建漳州诏安县社会劳动保险中心公益性岗位工勤服务辅助人员岗位招聘3人考试备考试题及答案解析
- 2026福建泉州晋江市侨声中学教师招聘意向摸底考试备考题库及答案解析
- 永州教育特色实践
- 2026年成都市青白江区卫生健康系统人员招聘笔试备考试题及答案解析
- 2026北京首都医科大学宣武医院面向应届毕业生(含社会人员)招聘55人(第二批)考试参考题库及答案解析
- 火灾疏散流程
- 2026年蚌埠市卫生健康系统事业单位人员招聘考试备考试题及答案详解
- 2026广东东莞市招聘事业编制教职员476人考试备考题库及答案解析
- 曲阜师范大学语文教学与研究(23年上半年)期末考试复习题
- 厦门市民族与宗教事务局补充招考1名非在编人员模拟预测(共500题)笔试参考题库+答案详解
- JJG 1192-2023电动汽车非车载充电机校验仪
- 飞轮储能技术基础
- SEW电机制动器课件
- 生产车间日常安全检查表
- 休克-最新课件
- 口腔固定修复体制作教学大纲
- 2B Lesson 15 The mud bath
- 铸件尺寸公差ISO806232007中文
- 大型活动策划与管理课程标准
评论
0/150
提交评论