可能重複:
Fields of class, are they stored in the stack or heap?類中的值類型被存儲在哪裏?
如果我有
Class A
{
int k=0;
}
和我做:
A x = new A();
哪裏是k
存儲?在堆或棧上?爲什麼?
可能重複:
Fields of class, are they stored in the stack or heap?類中的值類型被存儲在哪裏?
如果我有
Class A
{
int k=0;
}
和我做:
A x = new A();
哪裏是k
存儲?在堆或棧上?爲什麼?
這是(可能 - 見下文)存儲在堆上,以及所有其他類的數據。
它沒有存儲在堆棧中,因爲它沒有任何意義。由於該值是引用類型的一部分,因此即使在當前過程退出後它仍會繼續存在。但是,如果它在堆棧中,那麼在彈出堆棧幀後它將被刪除。這會使對象無效,除非有一些真正巨大的額外工作繼續試圖在堆棧中上下拖動以保持活動。
此外,堆棧是一個小空間,堅持代碼中創建的每個值類型的每個實例都會導致它非常快速地耗盡空間。
但是,最正確的答案是數據存儲的位置是一個實現細節,所以你應該假設你不知道(也不能)知道。引用類型和值類型之間的真正區別在於它們的內部屬性:對於值類型,諸如賦值和作爲參數傳遞等操作會導致對象的值被複制。對於引用類型,這些操作會創建對原始對象的額外引用。
即使k
是int是一個值類型是在引用類型包含,所以它會被存儲在堆上爲一體的部內存分配爲x
- 雖然這是一個實現細節,但這是.NET的當前行爲。
這是您不應該依賴的實現細節。 –
@Darin:是的,但事實是,這是對實際問題的當前答案。 Eric是對的 - 底層實現不是最重要的細節 - 但程序員應該*瞭解*他們使用的任何功能的潛在實現,以及它的含義可能是什麼,如果他們想編寫好的代碼。我並不是建議我們應該依靠實現細節來獲得微乎其微的性能提升,但是如果我們盲目地假設編譯器/ CLR會神奇地使代碼更快,我們會編寫大量廢話代碼。 –
你沒有收到備忘錄嗎? [該堆棧是一個實現細節](http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx)! – delnan