目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧。
1.【.Net基础一】 类型、对象、线程栈、托管堆运行时的相互关系
2.【.Net基础二】浅谈引用类型、值类型和装箱、拆箱html
接下来的会讲到方法的调用,这里先讲下JIT编译器。以CLR书中的代码为例(手打...)。
以Main方法为例:数据库
static void Main(){ Console.WriteLine("Hello"); Console.WriteLine("XiaoCong"); }
对结构进行初始化时,会把记录项指向JITCompiler函数。
数据结构
当第二次执行wirteLine时,因为第一次已经进行了验证和编译,因此跳过JIT函数,直接执行内存块中的代码。ide
写博客效率好低(Orz)。。。函数
下文讲到对象和类型对象要注意区分编码
首先进程运行时,会在托管堆上建立一个System.Type的类型对象(文章后边解释)。而后进程中的线程建立时会分配一个1MB大小的栈。
线程
先上一段代码(在书中代码基础上进行修改)3d
internal class Employee{ public Int32 GetYearsEmployed(){...} //非虚实例方法(实例方法) public virtual String GenProgressReprot(){...}//虚实例方法(虚方法) public static Employee LookUp(String name){...}//静态方法 } internal sealed class Manager:Employee{ public override String GenProgressReport(){...}//重写方法(虚方法) } void M1(){ String name="XiaoCong"; M2(name); ... return } void M2(String str){ Employee e; Int32 year; e = new Manager(); e = Employee.LookUp("ZhangSan"); year = e.GetYearsEmployed(); e.GenProgressReport(); }
序幕代码:进行一些初始化变量操做(初始化null或0)
结尾代码:负责方法完成以后对其进行清理操做。
调用一个方法时,还会将【返回地址】压入栈,方法在执行结束以后要返回这个位置。
指针
e = new Manager();
这会在托管堆中建立一个Manager类型对象的一个实例。即Manager对象(注意区分和类型对象的区别)。
该对象也包含类型对象指针和同步块索引。还包含必要的字节来容纳Manager类型定义的全部实例数据字段(包括基类字段)。
CLR会自动初始化内容类型对象指针,让它引用Manger类型对象。也会初始化同步块索引,并将对象的全部实例字段设为Null或0,而后调用类型构造器(修改实例字段数据)。
new 操做符返回Manager对象的内存地址,并将地址保存在变量e中。
code
e = Employee.LookUp("ZhangSan");
调用静态方法时,CLR会定位到静态方法的类型对象的类型对象(Employee类型对象)。而后找到对应的方法表中的记录项,对方法进行JIT编译(第一次执行该方法),再调用JIT生成的CPU指令。假设该方法到数据库中查找ZhangSan,而后返回一个全新的Manager对象,LookUp方法就会在堆上构造一个全新的Manager对象,用ZhangSan的数据库信息初始化它。而后返回该对象的地址保存在变量e中。而后旧的Manager对象会等待垃圾回收器进行回收释放。
year = e.GetYearsEmployed();
调用实例方法,JIT编译器会找到发出调用变量的类型(这里是e的类型Employee)的类型对象(Employee类型对象)。而后JIT查找记录项,对方法进行编译,执行CPU指令。
若是Employee类型没有定义那个方法,则会沿着基类一直寻找,直到Object类型。之因此能沿途查找,是由于每一个类型对象都有一个字段引用了它的基类型。
假设该方法返回5,则year就会为5。
e.GenProgressReport();
调用虚方法,JIT要在方法中生成一些额外代码。这些代码首先检查发出调用的变量,而后跟随地址找到发出调用的对象(这里是新的Manager对象)。接着代码对象内部“类型对象指针”,而后在类型对象(Manager类型对象)方法表中查找记录项,编译成成CPU代码。
若是LookUp方法发现的是一个Employee类型,这里执行的就是Employee类型的GenProgressReport方法。
基础太差,我的理解不知道是否有错误,有错误请指正,谢谢。
看书不易,写博客也不易,该睡了。。。( ╯□╰ )