C# で "new" キーワードを使用して構造体を作成する場合、メモリはヒープまたはスタックに割り当てられますか?
「new」演算子を使用してクラス インスタンスを作成すると、メモリがヒープに割り当てられます。しかし、「new」演算子を使用して構造体インスタンスを作成する場合、メモリはどこに割り当てられるのでしょうか?
スタックメモリとヒープメモリ
スタックは、プログラム実行中にローカル変数とメソッド呼び出しを保存するために使用されるデータ構造です。これは後入れ先出し (LIFO) 構造であり、最後に割り当てられたメモリが最初に削除されることを意味します。
ヒープは、必要に応じてオブジェクトが作成および割り当てられる動的メモリ空間です。スタックとは異なり、メモリ割り当ての特定の順序に従いません。
構造体のメモリ割り当てを作成するには、「new」キーワードを使用します
構造体の場合、「new」演算子を使用する場合は、次の 2 つの状況を考慮する必要があります。
パラメータなしのコンストラクター (new Guid();):
パラメータを持つコンストラクター (new Guid(someString);):
IL コード生成
舞台裏で何が起こっているのかを理解するために、C# コンパイラーによって生成された中間言語 (IL) コードを調べてみましょう。
newobj
ディレクティブは、スタック上にスペースを割り当て、中間値 (メソッド パラメーターなど) のパラメーター化されたコンストラクターを呼び出します。 call instance
ディレクティブは、パラメーター化されたコンストラクターを使用して、割り当てられたストレージの場所 (スタックまたはヒープ) を初期化します。 initobj
命令は、割り当てられたストレージの場所 (スタックまたはヒープ) を初期化し、その内容をゼロにクリアします (パラメーターなしのコンストラクター呼び出しの場合)。 結論
要約すると、常にヒープにメモリを割り当てるクラス インスタンスとは異なり、構造体で "new" 演算子を使用すると、パラメータなしのコンストラクタの場合とパラメータ化されたコンストラクタの場合にメモリがヒープに割り当てられます。スタック上にあります (一時保管用)。この動作は生成された IL コードに反映され、基礎となるメモリ管理プロセスについての洞察が得られます。
以上がヒープまたはスタック: 「new」は C# 構造体のどこにメモリを割り当てますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。