c 靜態方法和例項方法的記憶體分配問題

2022-05-04 05:06:11 字數 919 閱讀 4490

一直對例項方法的記憶體如何分配有很大疑惑(通俗的講就是例項方法在記憶體中有幾份),找了很多資料,以下是乙個比較令我滿意的答案,記錄下:

當呼叫靜態方法時,clr 會根據方法呼叫去尋找其對應的 type object,然後,把方法 jit,jit 之後的方法是本機**,可以直接執行,然後,這部分**被載入進入記憶體,方法的引數被載入進入當前執行棧,原來的執行上下文位址也被記錄到執行棧;方法開始執行,執行完後,執行棧中的返回位址被讀出,然後 clr 利用本機跳轉指令,跳轉到該返回至繼續執行。

當呼叫例項方法時,clr 會根據例項的 type object 指標找到對應的 type object,然後,把方法 jit,jit 之後的方法是本機**,可以直接執行,然後,這部分**被載入進入記憶體,該例項物件,以及方法的引數被載入進入當前執行棧 (例項物件永遠是第乙個引數,即 arg0,利用 ldarg0 指令進行讀取),原來的執行上下文位址也被記錄到執行棧;方法開始執行,執行完後,執行棧中的返回位址被讀出,然後 clr 利用本機跳轉指令,跳轉到該返回至繼續執行。

如果方法已經被 jit 過,則不會被第二次 jit。

方法在 il 中是以位元組流的形式存在的,所以,它仍然會佔據記憶體。

方法 jit 之後會被駐留在該程序的位址空間裡面,因此,它也會在執行時佔據記憶體。

方法的元資料存放在程式集 methodref 以及 methoddef 表中。

定義在值型別上的例項方法就比較麻煩了,大家有興趣可以想想它怎麼執行的。因為值型別沒有 type object 指標。

最後,大家都以為「靜態方法在堆上分配內 存,例項方法在堆疊上

這句話完全不靠譜,不要被迷惑了。。。只要提到方法,它就一定在 type object 上,也就是被分配在託管堆上。

總結下,不管是例項還是靜態方法,被jit只存在乙份,不過例項方法多了乙個引用該例項的引數作為它的第乙個引數!

靜態方法和例項方法

靜態方法 靜態方法是不屬於特定物件的方法,靜態方法可以訪問靜態成員變數,靜態方法不可以直接訪問例項變數,可以在例項函式呼叫的情況下,例項變數做為引數傳給靜態方法。靜態方法也不能直接呼叫例項方法,可以間接呼叫,首先要建立乙個類的例項,然後通過這一特定物件來呼叫靜態方法。例項方法 乙個例項方法的執行與特...

靜態方法和例項方法的區別

c 靜態方法和例項方法的幾種用法 見如下 這三種形式我們應該都用過。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 publicclasssomeclass publicstaticstaticmethod publicclas...

js的靜態方法和例項方法

靜態方法 1.定義乙個類 function aclass 2.給這個類新增乙個靜態方法 直接新增給類的就是靜態方法 aclass.staticmethod function 3.通過類名呼叫靜態方法 aclass.staticmethod 動態方法1.定義乙個類 function bclass 2....