在IL中,您可以使用.locals
指令定義局部變量。這些變量在哪裏存儲,堆棧或堆?.NET局部變量存儲在哪裏?
回答
這是非常多的JIT編譯器的實現細節。它會盡力將局部變量存儲在CPU寄存器中,非常高效。如果沒有足夠的寄存器可用於存儲所有本地變量,堆棧就是常用的後備存儲。在x86和x64抖動之間例如
很大的區別。 x64有更多的寄存器可用。這也適用於傳遞給方法的參數。 x86允許2通過一個CPU寄存器,x64允許4.加上任何可以存儲在FPU堆棧或XMM寄存器中的內容。所以,實際上有四個不同的地方可以存儲局部變量。
如果對象不是值類型,它是在堆上分配和對它的引用被存儲在堆棧中。否則,它直接分配在堆棧上。
在堆棧的參數。 .. BUT .....
1)對於引用類型,只有參考存儲在堆棧不是對象其參照上。實際的對象存儲在堆上。
2)對於值類型,實際值存儲在堆棧上。
現在,當在所述方法中執行流到達關閉支架堆棧上的值的類型的數據被破壞那裏,然後,同時在堆上引用類型的對象(其引用在這裏該方法的堆棧上)是交由垃圾收集系統在垃圾收集器本身決定的適當時間收集。
這也太出於同樣的原因,如標記的答案非常誤導。另外,絕對沒有破壞正在發生。無論是在IL還是機器代碼中。堆棧位置簡單地被放棄並最終被另一個激活堆棧框架覆蓋。即使引用類型在堆上的概念也不準確。實際的字符串實際上存儲在加載器堆中,靜態變量保存的地方。細節,細節。 – 2010-09-29 15:20:14
@Hans:感謝您的詳細資料......感謝您的解釋。 – explorer 2010-09-29 15:54:11
- 1. FORTRAN在哪裏存儲局部變量?
- 2. 變量存儲在哪裏?
- 3. 在哪裏存儲局部變量? NSKeyedArchiver或NSUserDefaults?
- 4. Java最終局部變量存儲在哪裏?
- 5. 方法局部變量存儲在哪裏?
- 6. 存儲在內存中的DLL的全局變量在哪裏?
- 7. 靜態存儲在內存中的全局變量在哪裏?
- 8. .NET「獨立存儲」存儲在哪裏?
- 9. 在PHP中,全局聲明的變量存儲在哪裏?
- 10. 揮發性變量存儲在哪裏?
- 11. Python中的變量存儲在哪裏?
- 12. $ _SESSION變量存儲在哪裏?
- 13. nodejs在哪裏存儲變量?
- 14. 在哪裏存儲javascript變量
- 15. selenium webdriver:存儲變量在哪裏?
- 16. JSFiddle在哪裏存儲我的變量?
- 17. golang環境變量存儲在哪裏?
- 18. 全局變量像$ _GLOBAL,$ _POST等存儲在哪裏?
- 19. Firefox 49開發工具,其中「存儲爲全局變量」存儲在哪裏?
- 20. .NET - 將URL存儲爲全局變量
- 21. 存儲在變量棧中的變量在哪裏?
- 22. 全局設置存儲在哪裏?
- 23. 本地,全局,靜態,自動,寄存器,外部,常量,易失性變量存儲在哪裏?
- 24. 在哪些內存中存在靜態變量,局部變量是否存在?
- 25. Python 3如何存儲局部變量?
- 26. 哪裏是內部存儲,手機存儲和外部存儲
- 27. 哪個更好? - ViewState中Web控件的局部變量或存儲變量
- 28. c中存儲的常量volatile變量在哪裏?
- 29. 如何知道寄存器變量存儲在哪裏?
- 30. 哪一部分在C++可執行文件中存儲全局常量變量?
+1,當談到IL時,對於當地人和參數有很多混淆。 IL與一個操作棧協同工作,但這並不直接對應於一個「調用棧」,比如C編譯器用'cdecl'或'stdcall'調用約定生成的調用棧。參數和當地人都被視爲編號插槽;與調用堆棧相似的唯一區域是何時從操作堆棧中彈出用於加載到方法調用的參數槽中的方法調用參數。 – 2010-09-29 15:24:18