ホームページ > バックエンド開発 > 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 中国語 Web サイトの他の関連記事を参照してください。

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