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

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

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

我的答复:

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


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

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

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

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

你可能感兴趣的:(C#)