回答
嚴格地說,它取決於代碼的位置。
如果代碼是常規函數/方法,它將隻影響堆棧。對堆沒有任何影響,因爲尚未構建MyClass對象。
假設MyClass是一個類(即引用類型),聲明將在棧上保留足夠的空間來容納對MyClass對象的引用。
這兩個聲明略有不同 - 第一個聲明沒有被初始化,所以任何嘗試訪問oMyClass1之前它被設置爲某些東西會給編譯器錯誤。第二個是初始化的,所以你不會遇到編譯器錯誤[雖然如果你在設置它引用一個實際的對象之前訪問了oMyClass2的方法或屬性,你會得到一個運行時錯誤,與oMyClass2 = new MyClass();]。
如果代碼是一個類聲明中:
class Fred {
MyClass oMyClass1;
MyClass oMyClass2 = null;
}
那麼它只會在Fred構造函數中執行。在構造函數被調用之前,空間(對於Fred對象,包括兩個MyClass引用的空間)已經在堆上分配了。這兩行代碼實際上不起作用,因爲空格已經被初始化爲空。
如果它在一個結構聲明內,只會在堆棧上(如果結構是本地的)或全局變量內存(如果結構是靜態的)產生相似效果。 [雖然,公平地說,我有點不確定在C#中靜態分配的位置 - 我只是假設它以類似於C++的方式完成]
我的疑問是如何將上述兩行影響內存(堆棧&堆)。
信息不足,兩種可能性:
他們是局部變量。在這種情況下,這兩行在堆棧上(無論何時執行該方法多長時間)進行2次相同的分配(參考,總是32/64位)。在堆上沒有分配。
它們是類或結構中的字段。在這種情況下,這兩行分配創建時實例中引用的大小。該實例可以在堆棧上(當它們是struct成員時)或堆(類成員)上分配。
+1編輯之後,在點2中區分結構和類。 –
- 1. 內存分配,堆棧和堆棧
- 2. 棧和堆內存
- 3. C程序的堆棧和堆內存
- 4. Java堆和堆棧內存分配
- 5. 堆棧和堆棧內存存儲在C++
- 6. 如何影響堆內存的大小?
- 7. 關於堆棧和堆棧內存使用的問題
- 8. WebAssembly堆棧/堆棧指針初始化和內存佈局
- 9. 其他內存區域(堆棧和堆棧除外)?
- 10. Console.WriteLine如何影響異常堆棧
- 11. 垃圾收集是否影響堆棧?
- 12. 堆棧內存的iostream
- 13. Android中的堆棧內存
- 14. 的memcpy堆棧內存
- 15. JVM - 堆棧和堆棧
- 16. C++堆棧內存和CPU緩存
- 17. OOP和堆/堆棧
- 18. 塊,堆棧和堆
- 19. .NET堆棧內存限制
- 20. 堆棧內存位置
- 21. 堆棧幀內存分配
- 22. C堆棧內存佈局
- 23. 堆vs堆棧存儲
- 24. 存儲在堆棧或堆
- 25. 內存中的堆棧實際上是一個堆棧嗎?
- 26. 多個堆棧和堆放在虛擬內存中的位置?
- 27. 進程虛擬內存 - 堆棧和堆之間的空間
- 28. 靜態,堆棧和堆內存分配的地址排序?
- 29. 導出寄存器對堆棧的性能影響是什麼?
- 30. 在內存中創建叉和堆棧
正如我已經在一個現在被刪除的答案中所說的,不是類成員的值類型的實例*並不總是存儲在堆棧中*。如果它們被lambda表達式或迭代器塊捕獲,它們將被存儲在堆上。 –
引用只會在堆棧上分配,如果它們是本地人。如果他們是班級成員,他們將會堆積如山。 –
@Frédéric值得詳細說明的是,如果他們被拉姆達捕獲,他們不再是「本地人」。它們將被轉換爲對閉包類(即包裝對象)的屬性的引用。閉包坐在堆上。 –