1. 程式人生 > >[C#學習筆記]類型對象指針和同步塊索引

[C#學習筆記]類型對象指針和同步塊索引

ros jit編譯器 sof 包括 運行機制 png obj 同步塊 font

寫在前面

看《CLR via C#》第四章時,看到了類型對象指針和同步塊索引這兩個概念,不知如何解釋,查看過相關資料之後,在此記錄。

類型對象指針

《CLR via C#》中的原話:

任何時候在堆上創建對象,CLR都自動初始化內部的“類型對象指針”成員來引用 與對象對應的類型對象。

在JIT編譯器將IL代碼轉換成本機CPU指令的時候,利用程序集的元數據,CLR提取與代碼中類型有關的信息,創建一些數據結構來表示類型本身。

CLR開始在一個進程中運行時,利用MSCorLib.dll中定義的System.Type類型創建一個特殊的類型對象,代碼中的類型對象都是該類型的“實例

”,因此,它們的類型對象指針成員會初始化成對的System.Type類型對象的引用

System.Object的GetType方法返回存儲在指定對象的“類型對象指針”成員中的地址。也就是說,GetType方法返回指向對象的類型對象的指針。這樣就可以判斷系統中任何對象(包括類型對象本身)的真實類型。

同步塊索引

先看如下圖:

技術分享圖片

首先,CLR創建類Manager,在內存中分配 類Manager 所占用的空間,當創建Manager的實例M1的時候,M1的類型對象指針就指向Manager。

當用lock來鎖定M1的時候,M1的同步塊索引就指向一個同步塊(這裏說明一下同步塊,CLR負責創建同步塊,可以把它理解為一個數組,數組中的每一個元素就是一個同步塊)。

M1的同步塊索引初始為一個負數,表示M1沒有同步,當用lock的時候,CLR負責在同步塊數組中尋找空閑的同步塊,並把M1的同步塊索引被設置為一個整數S,S為找到的同步塊在同步塊數組中的索引。

當lock結束之後,M1的同步塊索引又被重新設置為負數。

技術分享圖片

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

寫在最後

總結:

1、好好鉆研《CLR via C#》這本書!很多有意思的知識,可以深入的理解C#的運行機制。

2、.NET真是太棒了。

[C#學習筆記]類型對象指針和同步塊索引