欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[C#学习笔记]类型对象指针和同步块索引

程序员文章站 2022-07-11 10:54:37
写在前面 看《CLR via C#》第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录。 类型对象指针 《CLR via C#》中的原话: 任何时候在堆上创建对象,CLR都自动初始化内部的“类型对象指针”成员来引用 与对象对应的类型对象。 在JIT编译器将 ......

写在前面

看《clr via c#》第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录。

类型对象指针

《clr via c#》中的原话:

任何时候在堆上创建对象,clr都自动初始化内部的“类型对象指针”成员来引用 与对象对应的类型对象。

在jit编译器将il代码转换成本机cpu指令的时候,利用程序集的元数据,clr提取与代码中类型有关的信息,创建一些数据结构来表示类型本身。

clr开始在一个进程中运行时,利用mscorlib.dll中定义的system.type类型创建一个特殊的类型对象,代码中的类型对象都是该类型的“实例”,因此,它们的类型对象指针成员会初始化成对的system.type类型对象的引用

system.object的gettype方法返回存储在指定对象的“类型对象指针”成员中的地址。也就是说,gettype方法返回指向对象的类型对象的指针。这样就可以判断系统中任何对象(包括类型对象本身)的真实类型。

同步块索引

先看如下图:

[C#学习笔记]类型对象指针和同步块索引

 

首先,clr创建类manager,在内存中分配 类manager 所占用的空间,当创建manager的实例m1的时候,m1的类型对象指针就指向manager。

当用lock来锁定m1的时候,m1的同步块索引就指向一个同步块(这里说明一下同步块,clr负责创建同步块,可以把它理解为一个数组,数组中的每一个元素就是一个同步块)。

m1的同步块索引初始为一个负数,表示m1没有同步,当用lock的时候,clr负责在同步块数组中寻找空闲的同步块,并把m1的同步块索引被设置为一个整数s,s为找到的同步块在同步块数组中的索引。

当lock结束之后,m1的同步块索引又被重新设置为负数。

 

[C#学习笔记]类型对象指针和同步块索引

 

关于lock的一些有关概念,可以看我的上一篇博客。

写在最后

总结:

1、好好钻研《clr via c#》这本书!很多有意思的知识,可以深入的理解c#的运行机制。

2、.net真是太棒了。