2009-05-14 18 views
3

C#で参照型のサイズを調べる方法があるのだろうかと思っていました。私はいくつかのグーグルをやっているし、フォーラムでの一般的な考えは、これが不可能であるように思えます。私は皆さんに尋ねて、ここの誰かがよく知っているかどうかを知りたいと思った。C#参照型のサイズを調べる方法

結局のところ、プロファイリングツールにはこれを行う方法が必要ですか?私は、この情報を知る必要は通常ではないことを知っていますが、いくつかの状況にあることは有益です。

+2

私はこれが有効な複製であると信じています。http://stackoverflow.com/questions/207592/getting-the-size-of-a-field-in-bytes-with-c#207605 –

+0

はい、同意します私はこの質問のためにSOを検索し、何の結果も見つけられませんでした(私はこれがまだ尋ねられていなかったことを驚いていました)。私は質問が不十分なタイトルであると言うでしょう、それはおそらくより簡単な検索のために最適化する必要があります。 –

答えて

1

チェックthis detailed answerジョンによって、あなたには、いくつかの有用な情報を見つけることができます。

+0

ありがとうございます - 私はその質問を見つけようとしていました! –

+0

実際、それは(一般的に)包括的であり、一番上の段落は事実上この疑問をサブセットにします。これに基づいて投票を閉じる。 – annakata

0

おおよその見積もりができ、使用されたメモリをprofilig経由で追跡することも可能です。しかし、JITには、フレームワークのバージョン、マシン構成(特に32ビットと64ビット)、フレームワークプロバイダ(MS、Mono、GNU.NETなど)に応じて最適な形式のレイアウトを設定する自由があります。事前にそれを計算など

このようになります。

  • 参照が含まれる(プラットフォーム

  • クラスのインスタンスはタイプ情報に内部基準を有するに依存32ビットまたは64ビットでありますVTableなど)、含まれる各参照型(文字列または配列を含む)の参照に加えて、メモリ任意の構造体によって使用されます(これらは、アクセスが効率的になるようにレイアウトされている可能性があります。

そこで問題も、あなたがクラスまたはクラスによって使用されるメモリと、関連するデータ(フィールド内の文字列のように、配列、リスト、dictionatriesなど)を取得したいですか?

0

Hmmm。私はプロファイリングツールを使用すると思いますが、私はこのような何かがうまくいくかもしれないと思う:

long before = System.GC.GetTotalMemory(true); 
Foo instance = new Foo(); 
long after = System.GC.GetTotalMemory(true); 
long consumed = after - before; 
+1

投票の理由は何ですか? – user1068352

+0

これは、新しい空のオブジェクトのサイズのみを測定し、既存の空のオブジェクトの実際のメモリ消費量を反映しません。また、マルチスレッドソリューションでは精度の問題があるかもしれません。 – Alex

関連する問題