16

Intのサイズは4バイトです。プログラムで新しいIntを作成すると、メモリ消費量が4バイト増加します。右?

しかし、私がこのクラスを持っている場合

public class Dummy{
    private int;
}

新しいクラスはどのくらいのメモリを使用しますか?構造体の場合、メモリ消費量は少なくなりますか?参照自体もある程度のメモリを消費すると思います。

4

2 に答える 2

16

単一の参照は、32ビットプロセスでは4バイト、64ビットプロセスでは8バイトを使用します。参照は、クラスの標準的なオーバーヘッドです(参照型であるため)。構造体は参照を発生せず(まあ、潜在的なボクシングを無視します)、通常はコンテンツのサイズです。クラスにこれ以上のオーバーヘッドがあるかどうかは思い出せません。そうは思わないでください。

この質問では、クラスと構造体について詳しく説明します(質問のコメントにも記載されています)。

構造体で「new」を使用すると、ヒープまたはスタックに割り当てられますか?

コメントで述べられているように、クラスのインスタンスのみがこの参照オーバーヘッドを消費し、どこかに参照がある場合にのみ消費されます。参照がない場合、アイテムはGCの対象になります-参照がない場合、ヒープ上のクラスのサイズがわからないので、コンテンツのサイズであると推測されます。

実際、クラスには信頼できる真の「サイズ」がありません。そして最も重要なことは、これがクラスや構造体を使用する際の決定要因ではないことです(ただし、約16バイト以下の型が適切な構造体であり、それ以上の型はクラスに向かう傾向があるというガイドラインを見つける傾向があります)。私にとって決定的な要因は、意図された使用法です。

構造体について話すとき、私は次のリンクを提供する義務があると感じます。なぜ可変構造体は「悪」なのですか?

于 2012-09-13T09:04:57.333 に答える
4

クラスは参照型であり、ヒープに配置されます(そして、そこからgarbabeコレクターから削除されます)。構造体は値型であり、スタックに格納されます。
あなたの例の場合、参照型はオーバーヘッドが大きすぎるため、Microsoftは値型(構造体)を推奨しています。

このトピックに興味がある場合は、JeffreyRichterの「CLRviaC#」という本をご覧ください。

于 2012-09-13T09:07:47.240 に答える