程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 回復讀者問題:為何C#中類方法的IL代碼要放在類型表中?

回復讀者問題:為何C#中類方法的IL代碼要放在類型表中?

編輯:.NET實例教程

Dear 金老師:
   買了你的書<net2.0面向對象編程解密>後很受啟發,但是還有有些覺得不是很完整
如對象內存模型一章中,寫到:一個類可以創建多個實例對象,這些實例對象共享一個類型表
因為類的靜態字段都放置在類型表中,所以類的靜態字段被此類創建的所有對象共享
這可以理解
但是類的靜態和動態方法也是都放在類型表裡面的啊
那麼此類創建的所有對象共享動態方法嗎?
這點不理解啊\
   還有第二篇的第四章的繼承多態 能否也從對象內存的模型講解以下 像上面的一樣
比如方法的重載 隱藏 多態  你書上只說了是這樣
沒有像第三章那樣從內存的角度來說為什麼是這樣

     深夜打擾 不好意思  也萬分感謝你寫的書
小馬
===========================================================

 我的答復:

方法(即函數)代碼被編譯以後,以類為模板創建出來的每個對象,其方法代碼(IL指令)都是一樣的。如果每個對象都擁有自己的方法代碼,是不是很占用內存空間?


你可能會有點疑惑:如果動態方法是放在類型表中供所有對象共享的,那麼方法中的局部變量怎麼辦?多個對象都調用它,這不亂套了嗎?

其實,方法調用即函數調用,函數調用其返回地址是放在線程堆棧中的,其內部變量也放在線程堆棧中。每調用一次函數,就往線程堆棧中Push一個函數的相關調用信息(包括返回地址和局部變量的值),當函數調用返回時,從線程堆棧中Pop出來就行了,不存在沖突的問題.

IL代碼的JIT編譯器會幫助我們根據具體CPU和操作系統的情況生成相應機器指令處理底層的所有技術細節。

有關多態的內存模型,其實書中是有的,你可以看看<再探CLR對象模型>一節(應該是這一節,記不太清了)。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved