



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件英才网 软件行业驰名招聘网站 用汇编的眼光看c+(之模板函数) 如果说模板类定义的是一种数据类型,那么模板函数定义的就是一种函数。既然是函数,那么就有输入数据和输出数据。和模板类的概念差不多,模板函数的初衷也是为了在函数操作上抽取共同的特性,屏蔽的是类型的不同和差异。我们可以通过下面一个简单的代码说明问题:cpp view plaincopy1 int int_compare(int a, int b) 2 3 return a b ? a : b; 4 5 6 double double_compare(double a, double b) 7 8 return a b ? a : b; 9 上面的一段代码是取较大值的一段代码。两个函数之间最大的差别就是输入数据类型和输出数据类型之间的差别,那我们有没有一种办法可以屏蔽这种数据类型之间的差别呢?有。那就是函数模板:cpp view plaincopy10 template 11 type compare(type a, type b) 12 13 return a b ? a : b; 14 可以看到,模板函数和普通函数没有什么区别,只是在函数的上面把类型抽象成了type,那么模板函数应该怎么使用呢?cpp view plaincopy15 246: int i_value = compare(2, 3); 16 00401458 push 3 17 0040145A push 2 18 0040145C call ILT+10(compare) (0040100f) 19 00401461 add esp,8 20 00401464 mov dword ptr ebp-4,eax 21 247: double d_value = compare(2.3, 3.1); 22 00401467 push 4008CCCCh 23 0040146C push 0CCCCCCCDh 24 00401471 push 40026666h 25 00401476 push 66666666h 26 0040147B call ILT+5(compare) (0040100a) 27 00401480 add esp,10h 28 00401483 fstp qword ptr ebp-0Ch 29 248: 汇编代码表明,两个compare调用的函数地址并不是一致的。其中整数的compare地址是0x40100f,而double的地址是0x0040100a。这说明编译器在编译的时候帮我们同时生成了两个compare函数。所以说,模板类的本质就是在编译器增加判断处理工作的同时,减少手工的重复劳动。同时和模板类不一样,模板函数不需要显示定义函数的参数类型,这是因为可以从入参判断出函数的类型。 如果参数类型是 class类型呢? 我们可以试一试。首先定义基本class:cpp view plaincopy30 class data 31 32 int value; 33 public: 34 explicit data(int m): value(m) 35 data() 36 int get_value() return value; 37 int operator (data& d) return this-get_value() d.get_value(); 38 ; 接着,我们调用compare函数:cpp view plaincopy39 256: data m(4), n(2); 40 0040148D push 4 41 0040148F lea ecx,ebp-10h 42 00401492 call ILT+40(data:data) (0040102d) 43 00401497 mov dword ptr ebp-4,0 44 0040149E push 2 45 004014A0 lea ecx,ebp-14h 46 004014A3 call ILT+40(data:data) (0040102d) 47 004014A8 mov byte ptr ebp-4,1 48 257: data p = compare(m,n); 49 004014AC mov eax,dword ptr ebp-14h 50 004014AF push eax 51 004014B0 mov ecx,dword ptr ebp-10h 52 004014B3 push ecx 53 004014B4 lea edx,ebp-18h 54 004014B7 push edx 55 004014B8 call ILT+15(compare) (00401014) 56 004014BD add esp,0Ch 57 258: 256行: data构造了两个基本变量m和n 257行: 我们调用模板函数compare, 函数地址为0x401014,注意dx为p的地址,也就是堆栈临时变量的地址 为了看到算术符重载,我们跟进compare函数:cpp view plaincopy58 241: return a b ? a : b; 59 0040212B lea eax,ebp+10h 60 0040212E push eax 61 0040212F lea ecx,ebp+0Ch 62 00402132 call ILT+55(data:operator) (0040103c) 63 00402137 test eax,eax 64 00402139 je compare+53h (00402143) 65 0040213B lea ecx,ebp+0Ch 66 0040213E mov dword ptr ebp-18h,ecx 67 00402141 jmp compare+59h (00402149) 68 00402143 lea edx,ebp+10h 69 00402146 mov dword ptr ebp-18h,edx 70 00402149 mov eax,dword ptr ebp-18h 71 0040214C mov dword ptr ebp-10h,eax 72 0040214F mov ecx,dword ptr ebp-10h 73 00402152 mov edx,dword ptr ecx 74 00402154 mov eax,dword ptr ebp+8 75 00402157 mov dword ptr eax,edx 76 00402159 mov ecx,dword ptr ebp-14h 77 0040215C or ecx,1 78 0040215F mov dword ptr ebp-14h,ecx 79 00402162 mov byte ptr ebp-4,1 80 00402166 lea ecx,ebp+0Ch 81 00402169 call ILT+25(data:data) (0040101e) 82 0040216E mov byte ptr ebp-4,0 83 00402172 lea ecx,ebp+10h 84 00402175 call ILT+25(data:data) (0040101e) 85 0040217A mov eax,dword ptr ebp+8 我们发现compare模板语句下面构建了很多汇编语句,有一些冗长,我们可以大略介绍一下: (1) 开头调用call 0x0040103C函数就是调用重载运算符函数,ebp-18h表示即将被复制的是a数据还是b数据 (2) 比较返回结果后,开始复制数据,具体见0x402157,其中临时变量ebp-14h和临时变量ebp-4的操作可以忽略 (3) 函数返回前,对临时变量a和b进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年滋补类药品项目提案报告
- 2025年纳溪中考数学试卷及答案
- 安徽工程油箱解决方案(3篇)
- 莞城翻新改造工程方案(3篇)
- 2025年验孕棒项目提案报告范文
- 林草工程项目建设方案(3篇)
- 2025年认识更大的数试卷及答案
- 项目工程物流服务方案(3篇)
- 系统工程监理方案(3篇)
- 物业工程亮点服务方案(3篇)
- 医学教程 《精神卫生法》解读
- DB53-T 1285-2024 学校集体用餐配送服务规程
- 图书馆消防安全应急预案
- 《春》课后习题参考答案
- 推拿学课程教案
- 教学计划(教学计划)-2024-2025学年大象版五年级科学上册
- 品酒师(黄酒)理论知识考核要素细目表四级
- 一年级尊师礼仪
- DL∕T 1738-2017 双金属管标装置
- 液压软管接头24°锥密封端软管接头规范指引
- 2024挡烟垂壁包工合同协议书
评论
0/150
提交评论