《你必须知道的.NET》读书笔记:方法表初窥
一、窥探准备工作
public class Base
{
public void M()
{
Console.WriteLine("M in Base");
} public virtual void N()
{
Console.WriteLine("N in Base");
}
} public class Three : Base
{
private static int ID
{
get;
set;
} public override void N()
{
// Something new in class Three
Console.WriteLine("N in Three");
} public void M()
{
Console.WriteLine("M in Three"); M1();
} public void M1()
{
Console.WriteLine("M1 in Three");
}
} public class Program
{
public static void Main(string[] args)
{
Base three = new Three();
three.M();
three.N(); Console.ReadKey();
}
}
调试运行,执行结果如下图所示:

二、窥探方法表执行过程
2.1 方法表的创建
执行Main方法调用时,Three实例的创建与相应类型的加载也随之发生。然而,类型加载是在实例创建之前完成的,也就是我们常常说到的方法表创建。当程序执行到three.N()处时,Three类型的方法表如下图所示:

2.2 总体执行过程
(1)class loader 从元数据表加载相关元数据信息,根据信息创建方法表(这里主要是指CORINFO_CLASS_STRUCT结构)

(2)加载后,方法表槽都保存了应该执行的行为逻辑,这些信息保存在方法描述(Method Desc)结构中,MethodDesc被初始化为指向IL代码,同时还包含一个指向触发JIT编译的PreJitStub地址

2.3 具体执行过程
这里以N()方法来看看其具体的执行过程:
(1)任何方法第一次执行时都会首先触发执行JIT编译,JIT编译的主要工作就是将IL代码翻译为本地代码,并插入指向本地代码的jmp指令地址覆盖原来的Call JIT Complier指令

(2)当该方法再次被执行,因为方法描述(MethodDesc结构)中保存了机器码地址,以后的执行将不会执行JIT编译过程而直接执行机器码,实现整个执行过程。
三、小结

Metadata描述了静态的结构,而IL阐述了动态的执行,一静一动承载着很多的技术奥秘。
《你必须知道的.NET》读书笔记:方法表初窥的更多相关文章
- 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类
请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...
- 你必须知道的.net读书笔记第四回:后来居上:class和struct
基本概念 1.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段.属性.方法.属性.构造函数.索引器.操作符等.因为是基本的概念,所以不必在此 ...
- 必须知道的.net——学习笔记1
1.对象的生成(出生) Person aperson=new Person("小张",25) 构造过程:分配存储空间—初始化附加成员—调用构造函数 2.对象的旅程(在一定的约定与规 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- 《你必须知道的.NET》读书笔记一:小OO有大智慧
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象 (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...
- 《你必须知道的.NET》读书笔记二:小OO有大原则
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...
- 《你必须知道的.NET》读书笔记三:体验OO之美
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...
- 《你必须知道的.NET》读书笔记:从Hello World认识IL
通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...
- 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...
随机推荐
- js中typeof与instanceof用法区别
今天写JS代码,遇到动态生成多个名称相同的input复选按钮 需要判断其是否是数组,用到了if (typeof(document.MapCheckMgr.checkid)!="undefin ...
- PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天
PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1 关于转换构造函数 ClassDemo demo = 1; 调用转换构造函数 2 关于拷贝赋值函数 demo =2; 首 ...
- HTML5之tabindex属性
1 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title&g ...
- redis五种数据类型的使用(zz)
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- 原子操作--ARM架构
说明:内核版本号为3.10.101 一.ARM架构中的原子操作实现 在原子操作(一)中我们已经提到,各个架构组织为“复仇者”联盟,统一了基本的原子变量操作,这里我们就拿atomic_dec(v)来看看 ...
- 大前端学习笔记整理【四】LESS基础
第一次接触CSS预编译,然后对比后发现其实less的上手容易度确实比sass高不少,再加上公司项目也是使用的less.所以想想还是根据网上的各种教程,整理出来了一些比较基础的.而且比较能让我们这种初学 ...
- SQLite in Windows Store Apps
Using SQLite in Windows Store Apps : https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Using-SQL ...
- 排序算法 ----(转载::http://blog.csdn.net/hguisu/article/details/7776068)
1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序 ...
- WinCE下读取注册表获得SD路径
WinCE下读取注册表获得SD路径 [要点]WinCE注册表中[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\] 下键Folde ...
- js复制内容加版权声明代码
$("body").on('copy', function (e) { if (typeof window.getSelection == "undefined" ...