• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

聊聊C#和C++中的泛型模板底层玩法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近在看 C++ 的方法和类模板,我就在想 C# 中也是有这个概念的,不过叫法不一样,人家叫模板,我们叫泛型,哈哈,有点意思,这一篇我们来聊聊它们底层是怎么玩的?

一:C++ 中的模板玩法

毕竟 C++ 是兼容 C 语言,而 C 是过程式的玩法,所以 C++ 就出现了两种模板类型,分别为:函数模板类模板,下面简单分析一下。

1. 函数模板的玩法

玩之前先看看格式: template <typename T> rettype funcname (parameter list) { }

说实话,我感觉 C++ 这一点就做的非常好,人家在开头就特别强调了,这是一个 template,大家不要搞错了,按照这个格式,我们来一个简单的 Sum 操作,参考代码如下:


#include <iostream>

//求和函数
template <typename T> T getsum(T  t1, T  t2) {
	return t1 + t2;
}

int main() {

	int sum1 = getsum<int>(10, 10);

	long sum2 = getsum<long>(20, 20);

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

接下来我就很好奇,这种玩法和 普通方法 调用有什么不同,要想找到答案,可以用 IDA 去看它的静态汇编代码。

从静态反汇编代码看,当前生成了两个函数符号分别为: j_??$getsum@H@@YAHHH@Zj_??$getsum@J@@YAJJJ@Z,现在我们就搞清楚了,原来一旦给 模板 指定了具体类型,它就生成了一个新的函数符号。

乍一看这句话好像没什么问题,但如果你心比较细的话,会发现一个问题,如果我调用两次 getsum<int> 方法,那会生成两个具体函数吗? 为了寻找答案,我们修改下代码:


int main() {

	int sum1 = getsum<int>(10, 10);

	int sum2 = getsum<int>(15, 15);
}

然后再用 IDA 查看一下。

哈哈,可以发现这时候并没有生成一个新的函数符号,其实往细处说:j_??$getsum@H@@YAHHH@Z函数签名组合出来的名字,因为它们签名一致,所以在编译阶段必然就一个了。

2. 类模板的玩法

首先看下类模板的格式:template <typename T1, typename T2, …> class className { };

还是那句话,开头一个 template 暴击,告诉你这是一个模板


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ROS手动编写服务端和客户端servicedemo(C++)发布时间:2022-07-13
下一篇:
C#获取磁盘的空间大小发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap