2011-07-25 10 views
4

可能性の重複:
Fields of class, are they stored in the stack or heap?クラス内の値の型はどこに格納されていますか?

私は

Class A 
{ 
    int k=0; 
} 

を持っていると私はやっている場合:

A x = new A(); 

ですをが保存されていますか?ヒープやスタック上で?なぜ?

+2

メモがありませんでしたか? [スタックは実装の詳細です](http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx)! – delnan

答えて

2

ヒープに格納されている(おそらく - 以下を参照)、残りのクラスのすべてのデータ。

実際にスタックしても意味がないので、スタックには格納されません。値は参照型の一部であるため、現在のプロシージャが終了した後も値は存続し続けます。スタック上にある場合は、スタックフレームがポップされた後に削除されます。これは、スタックを上下にシャッフルして生き残るために、実際には特別な追加作業が行われていない限り、オブジェクトを無効にします。

さらに、スタックは小さなスペースであり、コード内で作成されたすべての値型のすべてのインスタンスをスティックすると、非常にすばやくスペースが足りなくなります。

しかし、最も正しい答えは、データが格納されている場所が実装の詳細なので、あなたが知っていない(そして理解できない)と仮定する必要があります。参照型と値型の間の実際の区別は、名前に組み込まれているonです。値型では、代入や引数渡しなどの操作によってオブジェクトの値がコピーされます。参照型の場合、そのような操作によって元のオブジェクトへの追加参照が作成されます。

4

明確な答えはありません。 CLRは、オブジェクトをスタックまたはヒープに配置するかどうかを定義しません。詳細について

kは、それがの一部としてヒープに格納されるので、それはは、参照型でが含まれている値型であるINTであってもエリックリッペルトのblogposts

6

を読み取りますxのために割り当てられたメモリ - これは実装の詳細ですが、これは.NETの現在の動作です。

+0

それはあなたが頼りにすべきではない実装の詳細です。 –

+1

@ダーリン:はい、実際の質問に対する現時点の回答はこれであるということは事実です。エリックは正しい - 基本的な実装は最も重要な詳細ではない - しかし、プログラマは良いコードを書いたければ、使用している機能の基礎となる実装とその意味を理解する*べきである。私は実装の細部に頼ってパフォーマンスの向上を図るべきではないと思っていますが、コンパイラ/ CLRが魔法のように素早くコードを作成すると盲目的に仮定すれば、 –

関連する問題