1

VS メモリ プロファイラーはbyte、クラスにフィールドを追加すると、アプリケーションの開始時に追加のメモリを必要としないことを教えてくれますが、それがintorの場合objectは、インスタンスごとに追加の 4 バイトが必要です。

他のタイプはありますか、または値が割り当てられる前にメモリを消費しない独自のタイプを作成できますか? また、値が再び null (ゼロ) になると、メモリは解放されますか?

4

3 に答える 3

3

32 ビット プラットフォームのメモリは、通常、4 バイトの割り当て単位で割り当てられます。.NET ランタイムがまさにそれを行っていると思います。

C# コンパイラは、クラス/構造体の割り当てサイズが最小になるレイアウトを使用します (注釈を使用してそうでないことを示す場合を除きます。たとえば、interop を使用してメモリを異なるレイアウトのアンマネージ コードと通信する場合など)。つまり、

  • 4バイト変数は 1 つのアロケーション ユニットのみを必要とします
  • 2 つの shortまたはushortは 1 つのアロケーション ユニットのみを使用します
  • intbyteがある場合、そのバイトは引き続き別の割り当て単位の使用をトリガーします。その後、別のアロケーション ユニットを必要とせずに、最大 3 つのバイト変数を追加できます。
于 2012-11-12T19:59:59.863 に答える
0

宣言されたすべての変数は、スタックまたはヒープのいずれかでメモリを占有します。

考えられる例外の 1 つは、使用中のハードウェアの適切なレジスタに収まるローカル変数です。その場合、特定のコンテキストでは、オプティマイザーと JIT コンパイラー(「可能性」を強調して) スタック フレームにスペースを割り当てるのではなく、レジスターに割り当てることを選択する場合があります。

于 2012-11-12T20:39:02.867 に答える
0

ありません。おそらく、オブジェクトがなければならない最小サイズがあり、バイトは最小に収まるほど小さいです。

于 2012-11-12T19:59:24.030 に答える