说说泛型

说说泛型

Author:zfive5(zhaozi)

Email : [email protected]

引子

 
关于一位埃及伟大法老王的都城,以前考古学家一直认为在尼罗河三角洲东北部某一处,那里有那个伟大法老王在位时期的建筑残骸,结果最近证实是在东北部的另一处农田下,以前认为的地方是旧城断流荒废后,全城迁移过去的 ……
 
泛型
 
泛型从学 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
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(1);
   Sample(10.1);
   Sample(1);
   Sample(10.1);
   p1=Sample;
   p2=Sample;
   printf("p1=%p/r/n",p1);
   printf("p2=%p/r/n",p2);
 
   return 0;
}
 
 

图示

说说泛型_第1张图片 

你可能感兴趣的:(.NET,C/C++)