说说泛型
Author:zfive5(zhaozi)
Email : zfive5@yahoo.com.cn
引子
关于一位埃及伟大法老王的都城,以前考古学家一直认为在尼罗河三角洲东北部某一处,那里有那个伟大法老王在位时期的建筑残骸,结果最近证实是在东北部的另一处农田下,以前认为的地方是旧城断流荒废后,全城迁移过去的
……
泛型
泛型从学
c++
的时候就接触使用,
那时起认为泛型是为了实现代码(
ANSI
)算法的复用出现的,这样的观念一直持续了很久,在
.net
加入泛型机制时,还一段时间认为既然都是
object
,还为什么要有它,最近用的、看的
.net
、
c#
比较多,也逐渐关注
.net
本身一些语言特性,发现以前的认识的确是片面的,在
c#
(第
5
版)里关于讲解泛型的部分,第一条讲的就是性能,呜呼,恍然大悟,装箱和拆箱,的确如果考虑到它,那真的是有泛型的可以让
for each
里的可以减少许多
il
指令,这可以在
idasm
里看
il
得到验证。关于泛型的特性还有就是代码的扩展,值类型的
JIT
生成多套代码,引用类型就可以使用一套代码(引用类型的就是一个指针)。关于这条
c++
也是这样处理,大家完全可以从下面的例子得到验证,其实细想一下也的确是这样,函数调用时
push
和使用时的
[bp+n]
在不同大小的参数时候就是不一样的,共享的部分也只有代码(
ANSI
)和算法了。剩下的类型检查不用多说,一看
C#
第
5
版就明白了,其它的特性感觉没有什么实质的东西了。
代码(VS2005,VC++):
#include "stdafx.h"
template <typename A>
void Sample(A para)
{
static int s=0;
s=s+1;
printf("s=%d/r/n",s);
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
void *p1=NULL;
void *p2=NULL;
Sample<int>(1);
Sample<float>(10.1);
Sample<int>(1);
Sample<float>(10.1);
p1=Sample<int>;
p2=Sample<float>;
printf("p1=%p/r/n",p1);
printf("p2=%p/r/n",p2);
return 0;
}
图示