4

静的クラスについての真実を見つけようとしてから長い時間が経ちました。私のポイントは、 new 演算子を使用する場合、値型はスタックに割り当てられ、参照型はヒープに割り当てられるということです。しかし、静的クラスの性質上、そのインスタンスを作成することはできず、値型ではないことを確認してください。CLR が静的コンテンツ用のメモリをいつ、どこに割り当てるのかという質問があります。いつ...コンパイル中、アセンブリがビルドされたときだと思いますが、よくわかりません。そしてどこについて...私が見つけようとしていたときに、J.Richterの「C#経由のCLR」を読んで、彼は書いた、インスタンスクラスの静的メソッドは、その特定のインスタンスを作成しているときにヒープに割り当てられますクラス (型オブジェクト ポインターと同期ブロック インデックスと共に)。しかし、私はそれを取得しません。それは静的です。べきだ」t はオブジェクトの状態に依存します。ですから、私を軽くしてください。

4

2 に答える 2

4

CLR は、まとめて "ローダー ヒープ" と呼ばれる、AppDomain に関連付けられた複数のヒープを保持します。これらは収集可能なオブジェクト (主に型関連のデータ) を含まないため、ガベージ コレクション ヒープとは異なります。AppDomain の存続期間中存在するデータの種類。

静的変数用のスペースは、そのうちの 1 つである HighFrequencyHeap に割り当てられます。JIT コンパイラーが割り当てを行い、それが生成するコードがメモリー位置を直接参照します。背景情報は、このMSDN マガジンの記事にあります。

于 2010-08-02T09:11:18.143 に答える
1

ユーザー ヒープ メモリと同様に、CLR はさまざまな簿記情報とメタデータをヒープに保持します。これには、実行するメソッドの実際のコードと、AppDomain にロードされたすべての型の Type オブジェクトが含まれます。名前、オーバーロード、抽象かシールか、および定義されているすべてのメソッド (静的とインスタンスの両方) のリストです。タイプ。

メソッドを実行すると、CLR はヒープの CLR 専用部分にある対応する Type オブジェクトのメソッド情報を検索し、そのメソッドを実行します。インスタンス メソッドと静的メソッドの唯一の違いは、インスタンス メソッドには、メソッドが実行されているインスタンスを指すメソッド引数に追加の「this」ポインターが含まれていることです。

したがって、静的情報は他のすべてのものと一緒にヒープに格納されますが、特定のオブジェクト インスタンスには関連付けられません。

于 2010-08-01T23:20:43.600 に答える