最近,我在看 C++ 方法和类模板。我在想C#也有这个概念,只是名字不一样。别人叫它模板,我们叫它泛型,哈哈,有点意思,我们在这篇文章中讲一下底层是如何工作的?
一:C++中的模板玩法
毕竟C++兼容C语言,而C是程序化的玩法,所以C++中有两种模板:函数模板和类模板,下面简单分析一下。
1. 如何玩转函数模板
播放前先看一下格式:template rettype funcname (parameter list) { }。
老实说,我觉得 C++ 在这一点上做得非常好。人们一开始就强调了这一点。这是一个模板。不要犯错。按照这个格式,我们来做一个简单的 Sum 运算。参考代码如下:
#include
//求和函数
template T getsum(T t1, T t2) {
return t1 + t2;
}
int main() {
int sum1 = getsum(10, 10);
long sum2 = getsum(20, 20);
printf("output: int:sum=%d, long: sum=%ld", sum1, sum2);
}
接下来我很好奇,这个方法和普通的方法调用有什么区别。要找到答案,可以使用 IDA 查看它的静态汇编代码。
从静态反汇编代码中,目前生成了两个函数符号:j_??$getsum@H@@YAHHH@Z和j_??$getsum@J@@YAJJJ@Z,现在我们可以弄清楚了,原来是一旦给模板一个具体类型,它就会生成一个新的函数符号。
乍一看,这句话似乎没什么问题,但仔细一看,就会发现问题。如果我调用了两次getsum方法,它会生成两个特定的函数吗?为了找到答案,我们修改下面的代码:
int main() {
int sum1 = getsum(10, 10);
int sum2 = getsum(15, 15);
}
然后用 IDA 再次检查。
哈哈,可以发现此时并没有生成新的函数符号。其实详细点:j_??$getsum@H@@YAHHH@Z是函数签名组合的名字,因为它们的签名是一样的,所以在编译阶段肯定是有的。
2. 如何使用类模板
先看类模板的格式:template class className { };
同样,开头的模板暴击告诉您这是一个模板
分类:
风吧
技术要点:
相关文章:
暂无评论内容