2012-01-24 29 views
2

プログラム内のメモリ割り当て:コードとデータ。スタック。ヒープ。.NETでグローバル変数にメモリを割り当てる方法は?

静的/グローバル変数(プリミティブ型とも言えます)がある場合、理論によれば、コンパイルされたプログラムがロードされたときにメモリが割り当てられることが示唆されます(この例では動的リンクとロードを無視し、 )。

しかし、グローバル変数が参照型の場合はどうなりますか?ランタイムはコード/データ領域のメモリ割り当てを調整しますか?あるいは、リファレンスが単にコード/データ領域に存在し、ヒープ内のメモリ領域を指しているのでしょうか?

答えて

3

静的変数は、JITコンパイラでのAppDomainのローダーヒープから割り当てられます。それはコードに直接アドレスをコンパイルし、非常に効率的です。 AppDomainがアンロードされると、ヒープが破棄されるまでそこに残ります。これはGCヒープではなく、可変アドレスは決して変更されません。

参照型の変数の場合は、書き込んだコードがあとで実行され、変数が初期化されます。変数に収集されたガベージヒープからのメモリのチャンクのアドレスを格納します。ガベージコレクタによって他の参照と同様に処理され、ヒープが圧縮されるときに値が更新されます。もちろん、変数にnullを明示的に割り当てないと、参照されるオブジェクトが第2世代になる可能性が非常に高くなります。

6

静的変数は、参照型または値型内で宣言されているかどうかにかかわらず、ヒープに格納されます。作成されるインスタンスの数に関係なく、合計で1つのスロットしかありません。

このヒープは、通常のガベージコレクションヒープとは別のものです。これは「高周波ヒープ」と呼ばれ、アプリケーションドメインごとに1つあります。それはマシンコードにILを変換するとき

チェックこの記事をStatic variable demystified

関連する問題