Dear 金老師:
買了你的書<net2.0面向對象編程解密>後很受啟發,但是還有有些覺得不是很完整
如對象內存模型一章中,寫到:一個類可以創建多個實例對象,這些實例對象共享一個類型表
因為類的靜態字段都放置在類型表中,所以類的靜態字段被此類創建的所有對象共享
這可以理解
但是類的靜態和動態方法也是都放在類型表裡面的啊
那麼此類創建的所有對象共享動態方法嗎?
這點不理解啊\
還有第二篇的第四章的繼承多態 能否也從對象內存的模型講解以下 像上面的一樣
比如方法的重載 隱藏 多態 你書上只說了是這樣
沒有像第三章那樣從內存的角度來說為什麼是這樣
深夜打擾 不好意思 也萬分感謝你寫的書
小馬
===========================================================
我的答復:
方法(即函數)代碼被編譯以後,以類為模板創建出來的每個對象,其方法代碼(IL指令)都是一樣的。如果每個對象都擁有自己的方法代碼,是不是很占用內存空間?
你可能會有點疑惑:如果動態方法是放在類型表中供所有對象共享的,那麼方法中的局部變量怎麼辦?多個對象都調用它,這不亂套了嗎?
其實,方法調用即函數調用,函數調用其返回地址是放在線程堆棧中的,其內部變量也放在線程堆棧中。每調用一次函數,就往線程堆棧中Push一個函數的相關調用信息(包括返回地址和局部變量的值),當函數調用返回時,從線程堆棧中Pop出來就行了,不存在沖突的問題.
IL代碼的JIT編譯器會幫助我們根據具體CPU和操作系統的情況生成相應機器指令處理底層的所有技術細節。
有關多態的內存模型,其實書中是有的,你可以看看<再探CLR對象模型>一節(應該是這一節,記不太清了)。