ホームページ > バックエンド開発 > C++ > ヒープまたはスタック: 「new」は C# 構造体のどこにメモリを割り当てますか?

ヒープまたはスタック: 「new」は C# 構造体のどこにメモリを割り当てますか?

DDD
リリース: 2025-01-13 15:16:41
オリジナル
684 人が閲覧しました

Heap or Stack: Where Does `new` Allocate Memory for a C# Struct?

C# で "new" キーワードを使用して構造体を作成する場合、メモリはヒープまたはスタックに割り当てられますか?

「new」演算子を使用してクラス インスタンスを作成すると、メモリがヒープに割り当てられます。しかし、「new」演算子を使用して構造体インスタンスを作成する場合、メモリはどこに割り当てられるのでしょうか?

スタックメモリとヒープメモリ

スタックは、プログラム実行中にローカル変数とメソッド呼び出しを保存するために使用されるデータ構造です。これは後入れ先出し (LIFO) 構造であり、最後に割り当てられたメモリが最初に削除されることを意味します。

ヒープは、必要に応じてオブジェクトが作成および割り当てられる動的メモリ空間です。スタックとは異なり、メモリ割り当ての特定の順序に従いません。

構造体のメモリ割り当てを作成するには、「new」キーワードを使用します

構造体の場合、「new」演算子を使用する場合は、次の 2 つの状況を考慮する必要があります。

  1. パラメータなしのコンストラクター (new Guid();):

    • 「new」演算子とパラメータなしのコンストラクターを使用すると、ヒープ上の構造体にメモリが割り当てられます。
    • これは、C# コンパイラーがパラメーターなしのコンストラクターを特殊なケースとして扱い、ゼロ初期化操作として扱うためです。
    • したがって、新しいメモリ場所がヒープ上に作成され、その中に構造が構築されます。
  2. パラメータを持つコンストラクター (new Guid(someString);):

    • 「new」演算子とパラメーター化されたコンストラクターを使用すると、一時ストレージとして スタック にメモリが割り当てられます。
    • コンストラクターが構造体を初期化した後、割り当てられたスタック メモリは破棄されます。
    • このプロセスは、インスタンス化された構造体をローカル変数に割り当てることとは異なります。これは、パラメーターなしのコンストラクターと同様に、ヒープ上にメモリを割り当てます。

IL コード生成

舞台裏で何が起こっているのかを理解するために、C# コンパイラーによって生成された中間言語 (IL) コードを調べてみましょう。

  • newobj ディレクティブは、スタック上にスペースを割り当て、中間値 (メソッド パラメーターなど) のパラメーター化されたコンストラクターを呼び出します。
  • call instance ディレクティブは、パラメーター化されたコンストラクターを使用して、割り当てられたストレージの場所 (スタックまたはヒープ) を初期化します。
  • initobj 命令は、割り当てられたストレージの場所 (スタックまたはヒープ) を初期化し、その内容をゼロにクリアします (パラメーターなしのコンストラクター呼び出しの場合)。

結論

要約すると、常にヒープにメモリを割り当てるクラス インスタンスとは異なり、構造体で "new" 演算子を使用すると、パラメータなしのコンストラクタの場合とパラメータ化されたコンストラクタの場合にメモリがヒープに割り当てられます。スタック上にあります (一時保管用)。この動作は生成された IL コードに反映され、基礎となるメモリ管理プロセスについての洞察が得られます。

以上がヒープまたはスタック: 「new」は C# 構造体のどこにメモリを割り当てますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート