函数模板和类模板的玩法玩之前分析

最近,我在看 C++ 方法和类模板。我在想C#也有这个概念,只是名字不一样。别人叫它模板,我们叫它泛型,哈哈,有点意思,我们在这篇文章中讲一下底层是如何工作的?

一:C++中的模板玩法

毕竟C++兼容C语言,而C是程序化的玩法,所以C++中有两种模板:函数模板和类模板,下面简单分析一下。

1. 如何玩转函数模板

播放前先看一下格式:template rettype funcname (parameter list) { }。

老实说,我觉得 C++ 在这一点上做得非常好。人们一开始就强调了这一点。这是一个模板。不要犯错。按照这个格式,我们来做一个简单的 Sum 运算。参考代码如下:


#include 

图片[1]-函数模板和类模板的玩法玩之前分析-唐朝资源网

//求和函数 template T getsum(T t1, T t2) { return t1 + t2; } int main() {

图片[2]-函数模板和类模板的玩法玩之前分析-唐朝资源网

int sum1 = getsum(10, 10); long sum2 = getsum(20, 20); printf("output: int:sum=%d, long: sum=%ld", sum1, sum2); }

图片[3]-函数模板和类模板的玩法玩之前分析-唐朝资源网

接下来我很好奇,这个方法和普通的方法调用有什么区别。要找到答案,可以使用 IDA 查看它的静态汇编代码。

从静态反汇编代码中,目前生成了两个函数符号:j_??$getsum@H@@YAHHH@Z和j_??$getsum@J@@YAJJJ@Z,现在我们可以弄清楚了,原来是一旦给模板一个具体类型,它就会生成一个新的函数符号。

乍一看,这句话似乎没什么问题,但仔细一看,就会发现问题。如果我调用了两次getsum方法,它会生成两个特定的函数吗?为了找到答案,我们修改下面的代码:


int main() {

图片[4]-函数模板和类模板的玩法玩之前分析-唐朝资源网

int sum1 = getsum(10, 10); int sum2 = getsum(15, 15); }

然后用 IDA 再次检查。

图片[5]-函数模板和类模板的玩法玩之前分析-唐朝资源网

哈哈,可以发现此时并没有生成新的函数符号。其实详细点:j_??$getsum@H@@YAHHH@Z是函数签名组合的名字,因为它们的签名是一样的,所以在编译阶段肯定是有的。

2. 如何使用类模板

先看类模板的格式:template class className { };

同样,开头的模板暴击告诉您这是一个模板

分类:

风吧

技术要点:

相关文章:

© 版权声明
THE END
喜欢就支持一下吧
点赞33赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容