C# 構造体と「新しい」演算子: ヒープとスタックの割り当て
C# の構造体を使用する new
演算子は、メモリ割り当て (ヒープまたはスタック) に関して複雑さをもたらします。常にヒープ上に割り当てられるクラスとは異なり、構造体は微妙な動作を示します。
パラメータなしのコンストラクターの使用法
パラメータなしのコンストラクター (new
など) で new Guid()
を使用すると、スタックに構造体メモリが割り当てられます。 C# コンパイラは、CLI 仕様に従って、これをコンストラクター呼び出しではなくゼロ初期化として扱います。
パラメータを持つコンストラクター
パラメータ化されたコンストラクター (new
など) で new Guid(someString)
を使用すると、コンテキスト依存の割り当てが行われます。
initobj
割り当てとそれに続くコンストラクター呼び出しが含まれます。 異なるコンストラクターを使用した後続の代入により、同じメモリ位置にある既存のデータが上書きされます。ldloca
を利用して変数のアドレスを取得します。 このキャッシュされたアドレスは、initobj
(パラメーターなしのコンストラクター) またはコンストラクター呼び出し (パラメーター化されたコンストラクター) のいずれかを使用して初期化され、メモリの再利用が可能になります。概要
概念的には、構造体に対する各 new
呼び出しはスタック メモリを割り当てるように見えますが、実際はより複雑です。 割り当ての動作はコンテキストに大きく依存します。 このニュアンスを理解することは、コードを効率化し、予期せぬ複雑さを防ぐために非常に重要です。
以上がヒープまたはスタック: 「new」は C# 構造体のどこにメモリを割り当てますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。