2010-09-29 116 views

回答

9

這是非常多的JIT編譯器的實現細節。它會盡力將局部變量存儲在CPU寄存器中,非常高效。如果沒有足夠的寄存器可用於存儲所有本地變量,堆棧就是常用的後備存儲。在x86和x64抖動之間例如

很大的區別。 x64有更多的寄存器可用。這也適用於傳遞給方法的參數。 x86允許2通過一個CPU寄存器,x64允許4.加上任何可以存儲在FPU堆棧或XMM寄存器中的內容。所以,實際上有四個不同的地方可以存儲局部變量。

+0

+1,當談到IL時,對於當地人和參數有很多混淆。 IL與一個操作棧協同工作,但這並不直接對應於一個「調用棧」,比如C編譯器用'cdecl'或'stdcall'調用約定生成的調用棧。參數和當地人都被視爲編號插槽;與調用堆棧相似的唯一區域是何時從操作堆棧中彈出用於加載到方法調用的參數槽中的方法調用參數。 – 2010-09-29 15:24:18

4

如果對象不是值類型,它是在堆上分配和對它的引用被存儲在堆棧中。否則,它直接分配在堆棧上。

9

在堆棧的參數。 .. BUT .....
1)對於引用類型,只有參考存儲在堆棧不是對象其參照上。實際的對象存儲在堆上。
2)對於值類型,實際值存儲在堆棧上。

現在,當在所述方法中執行流到達關閉支架堆棧上的值的類型的數據被破壞那裏,然後,同時在堆上引用類型的對象(其引用在這裏該方法的堆棧上)是交由垃圾收集系統在垃圾收集器本身決定的適當時間收集。

+2

這也太出於同樣的原因,如標記的答案非常誤導。另外,絕對沒有破壞正在發生。無論是在IL還是機器代碼中。堆棧位置簡單地被放棄並最終被另一個激活堆棧框架覆蓋。即使引用類型在堆上的概念也不準確。實際的字符串實際上存儲在加載器堆中,靜態變量保存的地方。細節,細節。 – 2010-09-29 15:20:14

+0

@Hans:感謝您的詳細資料......感謝您的解釋。 – explorer 2010-09-29 15:54:11

相關問題