【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
如果说模板类定义的是一种数据类型,那么模板函数定义的就是一种函数。既然是函数,那么就有输入数据和输出数据。和模板类的概念差不多,模板函数的初衷也是为了在函数操作上抽取共同的特性,屏蔽的是类型的不同和差异。我们可以通过下面一个简单的代码说明问题:
上面的一段代码是取较大值的一段代码。两个函数之间最大的差别就是输入数据类型和输出数据类型之间的差别,那我们有没有一种办法可以屏蔽这种数据类型之间的差别呢?有。那就是函数模板:
可以看到,模板函数和普通函数没有什么区别,只是在函数的上面把类型抽象成了type,那么模板函数应该怎么使用呢?
汇编代码表明,两个compare调用的函数地址并不是一致的。其中整数的compare地址是0x40100f,而double的地址是0x0040100a。这说明编译器在编译的时候帮我们同时生成了两个compare函数。所以说,模板类的本质就是在编译器增加判断处理工作的同时,减少手工的重复劳动。同时和模板类不一样,模板函数不需要显示定义函数的参数类型,这是因为可以从入参判断出函数的类型。
如果参数类型是 class类型呢? 我们可以试一试。首先定义基本class:
接着,我们调用compare函数:
256行: data构造了两个基本变量m和n
257行: 我们调用模板函数compare, 函数地址为0x401014,注意dx为p的地址,也就是堆栈临时变量的地址
为了看到算术符>重载,我们跟进compare函数:
我们发现compare模板语句下面构建了很多汇编语句,有一些冗长,我们可以大略介绍一下:
(1) 开头调用call 0x0040103C函数就是调用重载运算符函数,[ebp-18h]表示即将被复制的是a数据还是b数据
(2) 比较返回结果后,开始复制数据,具体见0x402157,其中临时变量[ebp-14h]和临时变量[ebp-4]的操作可以忽略
(3) 函数返回前,对临时变量a和b进行析构处理,见代码0x402169和代码0x402175。
注意:
(1)编写模板函数前先保证自己的函数是编写正确的
(2)模板函数的优先级低于非模板函数
(3)模板函数的类型可以是自定义类型,也可以是c、c++语言的基本类型
(4)模板函数的使用经常和类的算术运算符混合使用,注意技巧
(5)模板函数中涉及指针部分的内容,务必注意
【预告: 下一篇模板主要讲述特化模板、缺省模板】
分享到:
相关推荐
1.《从汇编看C++ 之函数开销》 2.《从汇编看C++ 之类成员》 3.《从汇编看C++ 之引用指针动态内存》 4.《从汇编看C++ 之虚函数接口多态》 欢迎大家下载,并到我微博上交流指正,我会继续努力(我微博上也叫小力庭)
用汇编的眼光看C++(之 总结篇)(pdf版本) 网络资源整理版本~~
C++虚函数调用的反汇编解析
C语言 指针
C++指令字典(汇编,C,C++,VB函数集合及中文说明)简单实用。
C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf
汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数汇编 入口 函数
用于查看c++库文件dll内部函数名称,反汇编工具的一款神奇。 用于查看c++库文件dll内部函数名称,反汇编工具的一款神奇。
在Visual_C++中使用内联汇编 本文档主要详细介绍如何在c/c++代码内涵汇编代码,推荐给学习c/c++的同学们下载
工程主要时C++内联汇编的示例,内部简单的用汇编实现了函数传参及调用,循环以及if语句的实现
c++反汇编 c++反汇编的好教程c++反汇编 c++反汇编的好教程c++反汇编 c++反汇编的好教程
多态是C++语言中最重要的特性之一,而虚表以及虚函数是实现多态的重要手段。许多C++语言的教材对于虚函数的使用以及调用机制有着详细的阐述,但是对于虚表的一些细节内容阐述却并不是很深,对于虚表我们可能会有很多...
c++反汇编中文教程,国外大牛非常经典之作,教你如何用IDA逆向C++。
通过挖掘c++编译器源码,深入理解c++语言精粹,有助于深刻掌握c++语言精髓。
在 Visual C++ 中使用内联汇编
c++中,如果为一个类没有明确定义一个构造函数,那么,编译器就会自动合成一个默认的构造函数。下面,通过汇编程序,来看一下其真实情况
在 Visual C++ 中使用内联汇编 VC内联ASM汇编 混合使用C和汇编代码的程序(用__asm写c函数)
集成了多种语言查询的“指令字典” 增加了新的功能,新的语言,新的界面,还对原有语言进行了全面扩充与完善(例如:C、C++的函数增加到了350多个,开放了文件修改功能等等)还有很多扩充完善这里就不多做介绍了,快来...
用汇编完成两个变量相加的独立子程序,编写C++调用汇编子程序,并将和显示在屏幕上
c++转汇编的小测试,c++转汇编的小测试c++。c++转汇编的小测试