寫在前面 看《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方法返回指向對象的類型對象的指針。這樣就可以判斷系統中任何對象(包括類型對象本身)的真實類型。
同步塊索引
先看如下圖:
首先,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真是太棒了。