1

この記事が重複しているように見えるかもしれませんが、この記事をすべて読み、テーマをテストするためのサンプルを開発します

c# でオブジェクト インスタンスのサイズをバイト単位で検索する http://www.codeproject.com/Questions/177604/Size-of-a-class-in-c メモリ内のオブジェクト サイズを取得するには? C# でフィールドのサイズをバイト単位で取得する http://blogs.msdn.com/b/cbrumme/archive/2003/04/15/51326.aspx

プロパティまたはフィールドをホワイトアウトするクラスがあります。サイズをテストするためだけに空です。

[Serializable]
public class MemberStateModel
{


}

私はオブジェクトを作成し、以下のコードでそのサイズを取得します:

 static void Main(string[] args)
    {
        MemberStateModel o = new MemberStateModel() {};
        long size;

        using (Stream s = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(s, o);
            size = s.Length;
        }
    }

現在、サイズは159を示しています。その投稿により、私のoサイズは159kbyteであることを意味していると思いますが、それは正しい方法ではなく、空のオブジェクトはこのサイズにすることはできません。本当ですか?

一部のユーザーのデータをセッションに保存し、サイトに追加されたユーザーによってこのサイズが大きくなると、Web アプリケーションを処理するためにより多くの物理メモリが必要になるため、これは私にとって非常に重要です。

4

3 に答える 3

1

BinaryFormatter は、クラスをバイナリにシリアル化するために必要なバイト数を示します。これは、クラスがメモリで使用するサイズとは大きく異なります。たとえば、 BinaryFormatter は型に関する情報をストリームに書き込みます。

オブジェクトがメモリ内で使用するサイズは、コンパイル時ではなく実行時に定義されます。これは、JIT コンパイラが最終的なレイアウトを決定するためです。ここで問題になるのは、サイズを調べる方法です。構造体の解決策 (配列の作成、ポインター演算の実行) はありますが、クラスについてそれを見つける方法がわかりません。1 つの解決策は、クラスを構造体として定義MemberStateModelし、それを測定してから、同じサイズであると仮定してクラスに戻すことです。

フィールドのサイズを下限としてカウントすることで、サイズを見積もることもできます (パディングが発生するため)。クラスに他のクラス インスタンスへの参照がある場合、推定するのはほぼ不可能になります。

于 2013-08-17T16:32:00.403 に答える