回复读者问题:为何C#中类方法的IL代码要放在类型表中?

Dear 金老师:
   买了你的书<net2.0面向对象编程解密>后很受启发,但是还有有些觉得不是很完整
如对象内存模型一章中,写到:一个类可以创建多个实例对象,这些实例对象共享一个类型表
因为类的静态字段都放置在类型表中,所以类的静态字段被此类创建的所有对象共享
这可以理解
但是类的静态和动态方法也是都放在类型表里面的啊
那么此类创建的所有对象共享动态方法吗?
这点不理解啊/
   还有第二篇的第四章的继承多态 能否也从对象内存的模型讲解以下 像上面的一样
比如方法的重载 隐藏 多态  你书上只说了是这样
没有像第三章那样从内存的角度来说为什么是这样

     深夜打扰 不好意思  也万分感谢你写的书
小马
===========================================================

 我的答复:

方法(即函数)代码被编译以后,以类为模板创建出来的每个对象,其方法代码(IL指令)都是一样的。如果每个对象都拥有自己的方法代码,是不是很占用内存空间?


你可能会有点疑惑:如果动态方法是放在类型表中供所有对象共享的,那么方法中的局部变量怎么办?多个对象都调用它,这不乱套了吗?

其实,方法调用即函数调用,函数调用其返回地址是放在线程堆栈中的,其内部变量也放在线程堆栈中。每调用一次函数,就往线程堆栈中Push一个函数的相关调用信息(包括返回地址和局部变量的值),当函数调用返回时,从线程堆栈中Pop出来就行了,不存在冲突的问题.

IL代码的JIT编译器会帮助我们根据具体CPU和操作系统的情况生成相应机器指令处理底层的所有技术细节。

有关多态的内存模型,其实书中是有的,你可以看看<再探CLR对象模型>一节(应该是这一节,记不太清了)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值