《从LRS项目来看”泛型“(三)——刨根问底,泛型工作原理》

引言:

  接上一篇从《LRS项目来看”泛型“(二)——异曲同工,泛型过程与C++模板的比较》。上回咱们谈到了泛型技术和C++中的模板技术很像!但是,那只是表面现象,对于其内部的工作原理并没有做深入的研究,下面让咱们从比较专业的角度深入代码编译的过程来看看,泛型和模板不一样的地方……

原理比较:

  vb.net泛型的语法和C++模板类似,但编译器在实现和支持他们的方式存在重要的差异。与C++模板相比,vb.net泛型可以提供增强的安全性,但在功能方面也受到某种程度的限制。

  C++的模板工作原理:

  在一些C++编译器中,在通过特定类型使用模板类之前,编译器甚至不会编译模板代码,当确实指定了类型时,编译器会以内联方式插入代码,并且将每个出现一般类型参数的地方替换为指定的类型。此外,每当使用特定类型时,编译器都会插入特定于该类型的代码,而不管是否已经在应用程序的其他位置为模板类指定了该类型,其中C++链接器负者解决该问题,但并不总是有效,而这也可能会导致代码膨胀,从而增加加载时间和内存足迹。

 vb.net中泛型工作原理:

  在.netFramewrok 2.0 中,泛型在ILCLR本身中具有本机支持。在编译泛型vb.net代码时,像其他任何类型一样,首先编译器会将其编译为IL,但是,IL只包含实际特定类型的参数或占位符,并有专用的IL指令支持泛型操作。泛型代码的元数据中包含泛型信息。真正的泛型实例化工作是以“on-demand”的方式,发生在JIT编译时。当进行JIT编译时,JIT编译器用指定的类型实参来替换泛型IL代码元数据中的T,进行泛型类型的实例化。这会像JIT编译器提供类型特定的IL元数据定义,就好像从未涉及到泛型一样。JIT编译器可以确保参数正确性,实施类型安全检查,甚至执行类型特定的IntelliSense

 当.net将泛型IL代码编译为本机代码时,所产生的本机代码取决于指定的类型。JIT编译器跟踪已经生成特定类型的IL代码,如果本机指定的是值类型,则JIT编译器将泛型类型参数替换为指定的值类型,并且将其编译为本机代码。如果JIT编译器用已经编译为本机代码的值类型编译泛型IL代码,则只返回对IL代码的引用。因为JIT编译器在以后的所有场合中都将使用相同的值类型特定的IL代码,所以不会存在代码膨胀问题。如果本机指定的是引用类型,则JIT编译器将泛型IL嗲没种的泛型参数替换为object,并将其编译为本机代码。在以后的任何针对引用类型而不是泛型类型参数的请求中,JIT编译器只会重新使用实际代码,使用该代码,实例仍然按照它们离开托管堆的大小分配空间,并且不会存在强制类型转换。


  是不是有点晕?哈哈,为了辅助大家理解:特此附上两张图

1、C / C++非托管编译过程图


2、C#,vb.net等.net平台下托管编译过程图


  


评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值