2016-05-26 6 views
4

高分解能波形の場合、約320,000,000のデータポイントで作業します。各データポイントは、合計8バイトの2つの浮動小数点(XY座標)を必要とします。C#では、構造体にどれくらいのメモリが必要ですか?

このメモリを一度に割り当てられていために、私は次のようなstructを使用して計画された:

public struct Point 
{ 
    public float X; //4-bytes 
    public float Y; //4-bytes. 
} 

構造体は値型ですので、私はそれだけで消費することを想定しています各変数に必要なメモリ量と、小額の固定金額がCLR(共通言語ランタイム)で使用されています。

アプリケーションの実行時に構造体が使用するメモリ量を計算する方法はありますか?つまり、私は次のことを知っています:

  • 構造体内にいくつの変数がありますか。
  • 各変数に使用されるバイト数。
  • 与えられた時点で、構造体のいくつのインスタンスが生きていますか。
+0

'GC'クラスにはいくつかのメモリ測定機能があります。 –

+2

もっと深刻な問題は、これらの320millをどのように作ろうとしているかです。配列内のリストで.... – pm100

+1

https://blogs.msdn.microsoft.com/joshwil/2005/08/10/bigarrayt-getting-around-the-2gb-array-size-limit/(または検索用語 'gcAllowVeryLargeObjects ')がここで使用されている可能性があります。 – spender

答えて

4

構造体は値型であるので、私はそれだけで、各変数に必要なメモリの量、ならびにCLR(共通言語ランタイム)によって使用されるいくつかの小さな、一定量を消費すると仮定しています。

いいえ。値型には継承オーバーヘッドはありません。これは継承をサポートできないというトレードオフです。

したがって、それに含まれるフィールドのサイズを支払うだけです。


例外:

あなたがタイプObjectの変数に構造体を固執した場合、それはオブジェクトのオーバーヘッドがあります

私はブログの記事でこのことについて話を「メモリと文字列 "です。実装固有ですが、Microsoft .NET CLR v4の場合、x86 CLRにはオブジェクトごとに8バイトのオーバーヘッドがあり、x64 CLRにはオブジェクトごとに16バイトのオーバーヘッドがあります。

What is the memory overhead of a .NET Object

インターフェイスタイプにキャストした場合、同じことが起こります。

の構造体に構造体を貼り付けると、配列自体にオブジェクトのオーバーヘッドに配列の長さを格納する整数が加えられます。しかし、これは配列の長さにかかわらず固定コストです。

あなたはList<struct>構造体を固執する場合は、2つのオブジェクトがあります:リストおよびリストで使用される配列を。オブジェクトごとのコストの2倍、リストから配列へのポインタ、配列のどれくらいが現在使用されているかを知る整数。

あなたがListまたはList<object>構造体を固執する場合は、上記のオーバーヘッド、プラスワンリストの項目ごとのポインタ、プラスリスト内の項目ごとに、オブジェクトごとのオーバーヘッドのコストを持っています。

+1

これは彼が彼の構造体の1つのために8バイトで終わることを意味します。彼がリストのアプローチ – whymatter

+1

を使用している場合、個々のフィールドにはパディングがある可能性があることに注意してください。 https://msdn.microsoft.com/en-us/library/hx1b6kkd.aspx –

+0

@whymatterですが、リストの方が大きくなります。物事をリストに保管するためのスペースが必要です。 strcut自体は8バイトですが、リストノードのスペースが別に必要です – pm100

関連する問題