C#-CLR-4类型基础(和函数执行原理-重要)

4.4运行时的相互关系 (源代码、IL、JIT编译的代码之间的关系)

  • CLR创建线程时,会创建1M的栈。用于方法传递实参和方法内部的局部变量。(高位向低位构建)

  • 线程栈的工作流程:
    执行的前后会有两个额外的方法初始化和收尾处理。
    A、局部变量压入栈
    B、
    C、

下图过程解释:

  • 1 堆中初始化类型对象--注意是“类型对象”而非“对象”(类型对象指针、同步块索引、静态变量和方法表)
  • 2 初始化对象所有字段为null或者0。
  • 3 new 操作返回对象e,保存到线程栈。
  • 4 调用Employee的静态方法Lookup。CLR定位到类型对象,在类型对象的方法表查找改方法对应的记录项,对方法JIT编译(如有需要),再调用JIT编译好的代码。
  • 5 GetYearsEmployed 同理
  • 6 调虚实例方法GetProgressReport。调用时,JIT编译器要在方法中生成一些额外的代码(方法每次调用都会执行)。这些代码先检查发出调用的对象(e指向的对象),检查对象内部的“类型对象指针”成员(该成员指向对象的实际类型),然后类型对象方法表中查找被调用方法的记录项,同理以上4中的后面部分。
  • 补充:
    Type类型对象的类型对象指针指向自己。
posted @ 2020-07-13 11:35  天山鸟  阅读(214)  评论(0编辑  收藏  举报