0

変数を宣言してからその変数のオブジェクトを作成すると、バックグラウンド(メモリの場合)で何が起こりますか。参照変数はどこにでも、どの形式で、この変数がヒープ上のメモリをどのように指すかを格納しますか。コメントで以下の疑問を明確にしてください。

例えば

ClassA instance;       // Where this variable store and how much memory occupies
instance=new ClassA(); //How instance variable points to memory

編集

プログラムに未使用の変数が非常に多く含まれている場合、プログラムのメモリに何が影響しますか。

4

4 に答える 4

1

参照自体のローカル変数の格納場所はプラットフォームに依存します(ジッタはそれを格納する場所を選択できます)。通常、ローカル変数を定義するメソッドの呼び出しスタックのメモリまたはCPUレジスタにあります。サイズもプラットフォームに依存しますが、通常、32ビットアーキテクチャの場合は4バイト、64ビットアーキテクチャの場合は8バイトです。

参照は、ヒープを「指す」場合とそうでない場合があります。オブジェクトへのアクセスに使用できる不透明な参照識別子と考えることをお勧めします。基になるポインタは実行時に変更される可能性があります。

未使用の変数に関しては、最適化コンパイラが未使用のローカル変数を完全に削除することが多いため、実行時のパフォーマンスにはまったく影響しません。また、参照を格納するために話しているオーバーヘッドのタイプは、最新のプラットフォームではごくわずかです。

于 2012-11-18T17:13:22.887 に答える
1

参照変数はインラインで格納されます。ローカル変数の場合はスタックに割り当てられ、クラスのメンバーの場合はヒープ上のオブジェクトの一部として割り当てられます。

クラスのインスタンスは常にヒープに割り当てられます。

参照は単なるポインターですが、特別なのは、ガベージコレクターが参照を認識していることです。したがって、参照は、ポインターが使用するスペースの量を使用します。32ビットプロセスでは4バイトを使用し、64ビットプロセスでは8バイトを使用します。

于 2012-11-18T17:16:36.563 に答える
1

インスタンス変数は実行時の単なるポインタであり、GCヒープに割り当てられたオブジェクトを指します。変数は、スタック、CPUレジスタ、ヒープ上にある別のオブジェクト内、または静的な場合はローダーヒープ内のどこにでも存在できます。

ガベージコレクターの重要な点は、ガベージコレクション中にこのポインターを見つけることができることです。したがって、オブジェクトがまだ参照されていることを確認でき、ヒープを圧縮するときにポインタ値を調整できます。参照が別のオブジェクト内で静的である場合、これはかなり簡単です。スタックまたはレジスタ上にある場合、ジッターはGCにそれを検出させるのに十分な情報を提供します。

于 2012-11-18T17:16:48.043 に答える
0

これについての回答が必要な場合は、「CLR via C#」を入手することをお勧めします。これは、CLRがどのように機能するかについての本であり、これに関する多くの情報が含まれています。

あなたの質問に答えるために、あなたがこの質問に答えるために考えなければならないことがたくさんあります。

たとえば、各メソッドの命令をクラスに格納する必要があります。クラスが最初にロードされるとき、これは事実上.NetIL命令へのポインタになります。このメソッドがアプリケーションで最初に必要になると、プロセッサの実際の命令にJITコンパイルされ、メモリに保存されます。

次に、クラスごとに1回だけ保存されるクラスフィールドの静的ストレージがあります。

インスタンス化される.Netの各クラスには、さまざまな理由でストレージが必要ですが、継承、ガベージコレクション、レイアウトなどに限定されません。次に、それ自体がストレージを取得するオブジェクトに対して保持できるさまざまな参照用のストレージがあります。

メモリがあなたのしていることに本当に重要であるなら、C#はあなたのアプリケーションにとって最良の選択ではないかもしれません。それ以外の場合は、.NETを使用することで得られる生産性のメリットを享受し、この使いやすさにはメモリ使用量の代償とC / C ++アプリのパフォーマンスの低下(場合によっては)が伴うことを受け入れてください。

于 2012-11-18T17:17:34.317 に答える