C# 結構與「新」運算子:堆疊與堆疊分配
C# 中結構體的 new
運算子引入了記憶體分配(堆疊或堆疊)的複雜性。與總是在堆上分配的類別不同,結構表現出微妙的行為。
無參數建構子的用法
使用 new
和無參數建構子(例如 new Guid()
),在堆疊上分配結構記憶體。 根據 CLI 規範,C# 編譯器將其視為零初始化,而不是建構函式呼叫。
帶參數的建構子
將 new
與參數化建構子(例如 new Guid(someString)
)一起使用會導致上下文相關的分配:
initobj
分配,然後是建構函式呼叫。 使用不同建構函數的後續賦值將覆蓋同一記憶體位置中的現有資料。 ldloca
來取得變數的位址。 然後使用 initobj
(無參數建構函式)或建構函式呼叫(參數化建構函式)初始化此快取位址,從而實現記憶體重用。 總結
雖然從概念上講,對結構的每個 new
呼叫可能看起來都是分配堆疊內存,但實際情況更為複雜。 分配行為在很大程度上取決於上下文。 理解這種細微差別對於高效的程式碼和防止不可預見的併發症至關重要。
以上是堆疊或堆疊:「new」在哪裡為 C# 結構分配記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!