首頁 > 後端開發 > C++ > 堆疊還是堆疊:C# 中「new」結構體在哪裡分配?

堆疊還是堆疊:C# 中「new」結構體在哪裡分配?

Patricia Arquette
發布: 2025-01-13 15:06:46
原創
789 人瀏覽過

Heap or Stack: Where Does `new` Allocate Structs in C#?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板