C# 中 new
運算子對結構體的記憶體分配:堆疊還是堆疊?
使用 new
運算子實例化類別時,記憶體分配在堆上。然而,new
運算子作用於結構體的行為取決於特定場景。讓我們探討一下這些差異:
帶參數的建構子
使用 new
呼叫結構體的帶參數建構子時,記憶體會分配在堆疊上。這類似於為值類型的局部變數賦值。
<code class="language-csharp">Guid local = new Guid("");</code>
這段賦值的 IL 程式碼使用 newobj
在堆疊上分配內存,並使用提供的字串初始化值。
無參數的建構子
使用 new
呼叫結構體的無參數建構子時,行為取決於上下文:
不會在堆疊上分配記憶體。而是使用 initobj
初始化現有的儲存位置(欄位或局部變數)。值類型在原地構造。
<code class="language-csharp">Guid field; ... field = new Guid();</code>
在堆疊上分配一個暫時的局部變量,並使用 initobj
初始化它。然後將該值作為參數傳遞給方法。
<code class="language-csharp">MethodTakingGuid(new Guid());</code>
不會在堆疊上分配記憶體。值類型直接在實例或靜態變數的儲存位置建構。
<code class="language-csharp">myInstance.GuidProperty = new Guid();</code>
結論
new
運算子與結構體一起使用時的分配行為取決於上下文。對於帶有參數的建構函數,記憶體始終分配在堆疊上。對於無參數的建構函數,取決於上下文,記憶體可能不會分配在堆疊上。此行為很大程度上取決於編譯器在轉換 C# 程式碼時產生的 IL 指令。
以上是堆疊還是堆疊:C# 中「new」結構體在哪裡分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!