C CLR記憶體那點事(高階)

2022-02-06 07:42:43 字數 1418 閱讀 7096

對於這篇,不想再對值型別進行討論,如要看值型別的記憶體怎麼玩可以看一下(clr記憶體那點事 初級),我們這篇主要討論一下引用型別。

先來裝備兩個類

internal

class

employee

public

virtual

string

getprogressreport()

}internal

class

manager : employee

}

employee類裡有乙個虛方法getprogressreport和乙個靜態方法lookup,manager類繼承了employee並重寫了getprogressreport.

static void main(string args)

我們在main裡面寫上這樣的**,來看看棧和堆是怎麼運作的。

當jit編譯器將這些il**轉換成本地cpu指令時,會注意到所有的型別:employee,manager,string(由於tom字串).

1.當執行方法之前,"prologue"**會為這些物件在記憶體中開闢空間。

2.employee e=new manager();會把e壓入棧,然後儲存manager物件位址,我們在初級篇的時候說過,每個物件都有乙個同步塊索引和型別物件指標,這個指標就說存的位址。

3.e=employee.lookup("tom");呼叫乙個靜態方法時,clr會定位與定義靜態方法的型別對應的型別物件。然後jit編譯器在型別物件的方法表中查詢與被呼叫的方法對應的記錄項,對方法進行jit編譯(如果需要的話),再呼叫jit編譯的**。這個時候我們知道loopup返回的是employee物件(這時,我一開始建立的manager物件還不確認有沒有被清除,因為gc會自動去清理這些託管**),所以在堆上面開闢乙個employee的記憶體塊並把e的位址改變成employee物件所在的位置。

注意:employee和manager型別物件都包含了」型別指標物件「成員。這時由於型別物件本質上也是物件。clr建立型別物件時,必須初始化這些成員。初始化成什麼呢?clr開始在乙個程序中執行時,會立即為mscorlib.dll中定義的system.type型別建立乙個特殊的型別物件。employee和manager型別物件都是該型別的」例項「。 因此,它們的型別物件指標成員會初始化成對system.type型別物件的引用。

順便說一句object.gettype返回的就說」型別指標物件「所儲存的位址。

學習那點事

這一周快過去了,回顧這一周,學到的,講到的東西,都很多,其實作為一名程式設計師,是不應該怕累的,雖然很累,學無止境,每天都要更新自己的知識,才能成為一名合格的程式設計師。我一直很想成為一名優秀的程式設計師,從剛開始的無知,經過很盲目,到現在明白了自己要學的是什麼,要怎樣學,這是乙個很艱難的過程,自己...

選舉那點事

選舉那點事 選舉前,大家都互相的打招呼,拉選票。可是我當時覺得好孤獨,好寂寞。當我看到大家在一起熱鬧的打招呼時,真的是忍受不了這種氛圍,偷偷的溜出去,暗自哭泣。我想知道這是不是以自我為中心,不願意走出去,將自己封閉了。我還想知道就那麼20票,當每個人都給你說要投他一票時,自己該怎麼說。老師說要的是鍛...

剝削那點事

鐵上無聊忽然想起了這個問題,竟然還想到了乙個答案。我想用乙個模糊點的稱呼 資本,我得出這樣乙個結論,所謂剝削不過是資本在社會博弈過程中所得到的分紅。資本在整個社會博弈中所面臨的對手包括管理機關,勞動者 和同業競爭者,其中管理機關也身擔裁判這個身份,這個紅利主要在勞動者身上取得,但是同時也和其他對手綜...