關於類的例項方法副本問題

2021-04-03 02:30:57 字數 1062 閱讀 6784

關於例項方法,在我頭腦中也基本能理清了...只是不知對否,現將它說出來.

的確,過於死鑽.net平台的細節並不是明智的學習方法.然而我覺得要編寫出優秀,高效的託管**,必須要對.net下的方法呼叫機制有個準確的理解.要明白當乙個例項類的方法被呼叫時,在高階語言提供的簡潔語法背後,clr如何為我們找到該方法,並呼叫它...

請注意,我並非要探求clr將例項方法處理成哪些資料格式,只是要清楚地理解它的原理...

一般來說,原理通常是簡單的,而實現是複雜的.

比如就我目前所知的:

型別分為值型別和引用型別;

類的方法被編譯後,形成一串il指令,當該方法第一次使用時,clr將這些il指令載入記憶體,並存放在程式區.可能在此之前,clr已經提前將該類的方法表也載入記憶體了,方法表存放的是該類的每個方法的位址.如下:

--------------------

| method1--->位址1 |

| method2--->位址2 |

| method3--->位址3 |

-------------------

而在每個類例項(注意是例項)內部,都有乙個類的附加成員(相對於值型別而言):乙個方法表指標,它指向的是上圖這個方法表在記憶體中的位址.(我們不考慮更細節的東西,否則會增加理解的難度,實際上也不用我們去理解,否則微軟靠什麼吃飯??^^,另外還有乙個附加成員是乙個同步塊之類的東東吧,用於執行緒的同步的.)

這樣當我們在程式中呼叫乙個方法時,在執行時,clr會根據該類的方法表指標找到方法表,然後在方法表中找到對應的方法的il指令的存放位址,以此將il指令載入到執行緒的呼叫堆疊中,同時還會在堆疊上為該方法內的值型別分配空間,為該方法內宣告的引用型別分配記憶體(在託管堆上),

呼叫結束後,即堆疊用il指令轉換的運算元完成計算操作後,所有分配的變數(值型別或引用型別)都會被彈出.(引用型別變數所指向的例項會成為不可達物件,會被gc**)

注意,我現在只是將il指令作為討論物件...實際上執行的還是jit編譯器編譯的本地機器碼.只是它更涉及到更複雜的操作,如本地機器碼還有自己的呼叫堆疊..等...這就不是我的腦袋所能相通的了...所以不用去想它..我只要想通這樣流程就可以對我寫程式有針對性的指導了.

關於Python類 方法 物件 例項 靜態方法

類裡面的方法有3種 類的例項方法 平時常用的帶有self的方法 靜態方法 staticmethod 類方法 classmethod 這裡主要看一下類的例項方法和靜態方法的區別 1 例項方法只能被例項物件呼叫,第乙個引數必須要預設傳例項物件,一般習慣用self 2 靜態方法 由 staticmetho...

例項方法 類方法

1.例項方法 動態方法 a 識別符號 b 呼叫方式 例項物件 函式 c 例項方法在堆疊上。2.靜態方法 類方法 a 識別符號 b 呼叫方式 類 函式 c 靜態方法在堆上分配記憶體。3.靜態方法和例項方法的區分 a 靜態方法常駐記憶體,例項方法不是,所以靜態方法效率高但佔記憶體。事實上,方法都是一樣的...

類變數 例項變數 類方法 例項方法 靜態方法。

classa aa 1def init self,x,y self.x x self.y y a a 2,3 a 是例項 aa 是類變數 如果用a.aa 100 修改的是類的變數 a.aa 101 會在a例項中建立乙個名叫aa的屬性,並賦值,如果本身就有aa屬性,才修改。class date 建構函...