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

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

Susan Sarandon
リリース: 2025-01-13 15:02:46
オリジナル
232 人が閲覧しました

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

C# 構造体と「新しい」演算子: ヒープとスタックの割り当て

C# の構造体を使用する new 演算子は、メモリ割り当て (ヒープまたはスタック) に関して複雑さをもたらします。常にヒープ上に割り当てられるクラスとは異なり、構造体は微妙な動作を示します。

パラメータなしのコンストラクターの使用法

パラメータなしのコンストラクター (new など) で new Guid() を使用すると、スタックに構造体メモリが割り当てられます。 C# コンパイラは、CLI 仕様に従って、これをコンストラクター呼び出しではなくゼロ初期化として扱います。

パラメータを持つコンストラクター

パラメータ化されたコンストラクター (new など) で new Guid(someString) を使用すると、コンテキスト依存の割り当てが行われます。

  • 一時値: 構造体が一時値 (メソッド引数など) として機能する場合、生成された中間言語 (IL) はスタック メモリを割り当て、コンストラクターを実行します。
  • 変数またはフィールドの割り当て: ローカル変数またはフィールドへの割り当てには、最初の initobj 割り当てとそれに続くコンストラクター呼び出しが含まれます。 異なるコンストラクターを使用した後続の代入により、同じメモリ位置にある既存のデータが上書きされます。
  • メソッド呼び出し: メソッド呼び出しでは、ldloca を利用して変数のアドレスを取得します。 このキャッシュされたアドレスは、initobj (パラメーターなしのコンストラクター) またはコンストラクター呼び出し (パラメーター化されたコンストラクター) のいずれかを使用して初期化され、メモリの再利用が可能になります。

概要

概念的には、構造体に対する各 new 呼び出しはスタック メモリを割り当てるように見えますが、実際はより複雑です。 割り当ての動作はコンテキストに大きく依存します。 このニュアンスを理解することは、コードを効率化し、予期せぬ複雑さを防ぐために非常に重要です。

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

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