どのオブジェクトがスタックに格納され、どのオブジェクトがメモリのヒープ部分に格納されるかについて、メモリの割り当てがどのように行われるかを誰かに教えてもらえますか?
2 に答える
Microsoft の C# コンパイラと CLR の実装では、値が一時的な値、ローカル変数、または仮パラメーターであり、匿名メソッドの閉じた外部変数でも反復子ブロックでもない場合、値の型はスタックに格納されます。 .
もちろん、必要のないものをスタックに保存する必要はありません。値型の一部のローカル変数は、スタックにまったく取得されません。彼らは生涯にわたって登録簿にとどまります。
値型のその他の値 (ボックス化された値型、参照型の値型フィールドなど) はヒープに格納されます。
もちろん、値の型は、スタック、レジスタ、マネージド ヒープのいずれにも格納できません。それらは、CLR の制御下にないまったく別のメモリ マネージャーを使用して、アンマネージ メモリに格納される可能性があります。
(そしてもちろん、「スタック」で「ザ」を使用すると微妙に誤解を招くことに注意してください。プロセスには多くのスタックが存在する可能性があります。スタックは 1 つだけである必要はありません。)
これはすべて実装の詳細であり、予告なく変更される場合があります。
また、明らかに、スタック alloc 宣言で割り当てられたものは、スタック上に割り当てられます。
このトピックの詳細については、私の記事を参照してください。
http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx
なんで気にするの?ランタイムがこれらすべての詳細を管理するので、心配する必要はありません。興味があるだけですか、それとももっと大きな問題につながるのでしょうか?
3 つの経験則:
- オブジェクトはヒープに格納されます。これらには、参照型とボックス化された値型のインスタンスが含まれます。
- ローカル変数とパラメーターはスタックに格納されます。ローカル値型の場合、これは値自体がスタックに格納されることを意味します。ローカル参照型の場合、参照のみがスタックに置かれます (編集: Eric Lippert が指摘した例外 - 外部変数、反復子ブロック値型で閉じられた値型ローカル)。
- フィールドは、それを含むインスタンスが配置されている場所に格納されます。たとえば、クラスの値型フィールドはヒープに格納されます。スタックに格納されたローカルとして宣言された構造体の参照型フィールドの参照部分もスタックに配置されます。