C 執行時的相互關係

2021-08-26 13:28:28 字數 1733 閱讀 9827

c#執行時的相互關係

本部落格主要講述執行時型別、物件、執行緒棧和託管堆之間的相互關係,靜態方法、例項方法和虛方法的區別,以及記憶體的分配和**。

執行緒棧:在乙個程序中可能包含多個執行緒,乙個執行緒在建立的時候,會分配到乙個大小1mb大小的棧,棧用於儲存方法的實參、形參以及方法內部的區域性變數,棧是從高位記憶體位址向地位位址構建的,由於棧有先進後出的特點,所以先定義的變數後被**。

下面來看乙個簡單的例子,讓你更了解執行緒棧

由於執行緒棧是從高位開始分配記憶體,先分配的我就畫在上面了,在呼叫f1();方法時,分配記憶體的順序是:name->n->f2的返回位址->age->name;**記憶體的順序當然是反過來的。在乙個方法中,應該包含一些序幕**,進行一些初始化工作,還有一些尾聲**,等方法執行完成之後做一些**工作。由於方法的返回位址先分配,在方法執行完成的時候回到返回位址,遞迴太深就容易出現棧溢位,請看我的《遞迴再一次讓哥震驚了》,因為引數、區域性變數都必須等到方法返回的時候才能**。

在介紹託管堆之前先看看兩個簡單的類:

在構造乙個物件的例項時,只需要為型別物件指標、同步索引塊、該物件的例項字段分配記憶體,對於物件例項來說,型別物件指標可以讓例項訪問型別物件中德靜態字段、方法等。

student是執行緒棧中的定義的乙個區域性變數,儲存student的乙個例項的在託管堆中的位址,所以他可以訪問student物件中的字段,方法,其實訪問方法是通過型別物件指標訪問型別物件student中的方法表中物件的項。

say方法的執行過程:變數student指向的是乙個student物件,呼叫的當然是student型別物件中的say方法,儘管在定義student的時候是person型別,因為他是引用型別,他指向的是託管堆中student物件的記憶體,然後遍歷該物件的方法表,找到該方法呼叫。

特別說明虛方法,jit在虛方法中加了一些額外的**,方法每次呼叫的時候都會執行這些**,這些**會檢查發出呼叫的變數,然後根據這個變數找到其應用的物件,然後呼叫這個物件的方法,若沒有這些**,你覺得clr是呼叫父類的方法還是呼叫之類的方法呢,虛方法帶來方便的同時,也多了這些必須的檢查的**。

setheight方法的執行過程:和say方法前面是一樣,只是在遍歷student物件的方法表時沒有找到該方法,我們知道父類中定義的非private方法都可以被子類繼承,是因為每個型別都定義了乙個字段引用了他的基類,如果乙個類呼叫的方法那個方法不是自己定義的,那麼編譯器會回溯類層次結構,一直到基類object,找到相關的方法並呼叫,如果沒有找到相關的方法就報了異常唄。所以setheight方法其實呼叫的是person中的setheight方法。

head方法的執行:由於head方法是靜態方法和上面兩個方法有所不同,呼叫靜態方法的時候,clr會定位與靜態方法物件的型別物件,然後在對應例項物件物件的方法表中查詢相關的記錄項,如果沒有找到,同樣會回溯。

部落格:

C 執行時的相互關係

c 執行時的相互關係 本部落格主要講述執行時型別 物件 執行緒棧和託管堆之間的相互關係,靜態方法 例項方法和虛方法的區別,以及記憶體的分配和 執行緒棧 在乙個程序中可能包含多個執行緒,乙個執行緒在建立的時候,會分配到乙個大小1mb大小的棧,棧用於儲存方法的實參 形參以及方法內部的區域性變數,棧是從高...

C 執行時的相互關係

c 執行時的相互關係 本部落格主要講述執行時型別 物件 執行緒棧和託管堆之間的相互關係,靜態方法 例項方法和虛方法的區別,以及記憶體的分配和 執行緒棧 在乙個程序中可能包含多個執行緒,乙個執行緒在建立的時候,會分配到乙個大小1mb大小的棧,棧用於儲存方法的實參 形參以及方法內部的區域性變數,棧是從高...

obj, lib, dll, h之間的相互關係

1。obj,lib,dll,h之間的相互關係如何?使用的時候呼叫方式有什麼不同?2。怎麼自己做乙個.lib的檔案?3。工程檔案中怎麼使用obj.檔案?回答 1.obj 是cpp對應的二進位制 格式,是未經重定位的!lib 是若干個obj的集合,本質與obj相同!dll 是可實際執行的二進位制 有定位...