用汇编的眼光看c(之模板函数)_第1页
用汇编的眼光看c(之模板函数)_第2页
用汇编的眼光看c(之模板函数)_第3页
用汇编的眼光看c(之模板函数)_第4页
用汇编的眼光看c(之模板函数)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论