1

.NET コンパクト フレームワークでメモリが割り当てられるのはいつですか? 値型と参照型に違いがある場合は、詳しく教えてください。確認するためのドキュメントまたは手順を歓迎します。

特に、このシナリオを検討してください...

private MyClass item;  // here?

public void MyMethod()
{
    item = new MyClass();  // or here?
}
4

3 に答える 3

5

メモリを割り当てる方法は 3 つあります。

静的:

これらはコンパイル時にバインドされ、割り当てられます。たとえば、グローバル静的変数。

スタック ダイナミック:

これらは実行時にバインドされ、スタックにプッシュされます。関数呼び出しのローカル変数など。

ヒープ動的:

現在、動的ヒープには、暗黙的および明示的など、いくつかの異なる「サブ カテゴリ」もありますが、その詳細については説明しません。

宣言すると

private MyClass item;  // here?

MyClass への参照がスタックにプッシュされます。これは単なる参考であり、それ以上のものではありません。その時点での値は null です。

public void MyMethod()
{
    item = new MyClass();  // or here?
}

その時点で、'new MyClass()' を呼び出すことによってメモリが明示的にヒープに割り当てられ、item がそれを参照します。

したがって、実際には、MyMethod を呼び出した後、2 つの変数があります。item という名前の参照型、および MyClass 型の item を参照するヒープ上の名前のない変数。

于 2008-10-29T18:33:11.230 に答える
1

これはひっかけ問題のようなもので、思ったよりもずっと好きです。:)

基本から始めましょう。

変数を宣言しても、参照型に直接メモリ*が割り当てられるわけではありません。値の型は宣言の時点で初期化されるため、値の型に対してはそうします参照型の場合、コンストラクターに入る時点でオブジェクトのストレージが割り当てられます。

*これが適用されないのはいつですか?

  • 特定のクラスを最初に使用すると (最初の行になる可能性があります)、クラスレベルの静的データが初期化され、クラスに静的コンストラクター (おそらくメモリを割り当てる) がある場合は、それも呼び出されます。したがって、実際には、変数宣言で (静的メンバー用に) いくらかのメモリを割り当てることができます。
  • 技術的には、参照型変数を宣言すると、スタックにメモリ割り当てられます (Nicholas Mancuso が述べたように)。割り当てられたメモリは、オブジェクトへの参照用のスタックレベル ストレージです。(確かに、上記の参照は ですがnull、オブジェクトを初期化すると、割り当てられたメモリに有効な参照が存在します。)

詳細については、スタックとヒープの割り当てに関するC-Sharp Corner の記事を強くお勧めします。

于 2008-10-29T18:39:31.017 に答える
0

CompactFrameworkのメモリ管理に関するMSDNWebケースを参照することを強くお勧めします。デスクトップでの動作とまったく同じではありません。このトークでは、GCヒープを理解するのに役立つ詳細とグラフィックを詳しく説明します。

于 2008-10-29T23:21:04.287 に答える