2011-06-29 11 views
2

この質問は単に私の興味を満たすことです。 Choosing Between Classes and Structuresを読むと、ページには「16バイト未満のインスタンスサイズがあります」と表示されます。構造体インスタンスのサイズを計算するにはどうすればよいですか?

この単純不変の場合、structが与えられます。

public struct Coordinate 
{ 
    private readonly double _latitude; 
    private readonly double _longitude; 

    public Coordinate(double latitude, double longitude) 
    { 
     _latitude = latitude; 
     _longitude = longitude; 
    } 

    public double Latitude 
    { 
     get { return _latitude; } 
    } 

    public double Longitude 
    { 
     get { return _longitude; } 
    } 
} 

Doプロパティも16バイト制限にカウントされますか?または、フィールドカウントのみですか?

structを使用しない場合は、doubleが8バイトであるため、マイクロソフトが提供するガイドラインに違反しますか? 2つのダブルは16バイトで、正確には16バイトで、それ以下ではありません。フィールドのみカウント -

+1

[私の構造で消費されたバイト数をチェックする方法]の複製が可能ですか?(http://stackoverflow.com/questions/3361986/how-to-check-the-number-of-bytes-consumed-by -my-structure) –

+2

このガイダンスは、 'struct'を使用するかどうかの使い方を誤っています。セマンティックな理由から 'struct'を使うかどうかを決めるべきです。技術的な理由は、大丈夫ですが、セマンティックな理由から実際にパフォーマンスの問題を見つけた場合にのみ、念頭に置く必要があります。 – jason

+0

@gcsoリンクのおかげで面白いread –

答えて

4

フィールド数だけです。

この場合、2つの64ビット(8バイト)のフィールドがあります。あなたはあなたのヒューリスティックの範囲内です。

auto-implemented propertiesを使用した場合、コンパイラはこれらのプロパティをバックアップするための「隠し」フィールドを作成するので、全体の合計で考慮する必要があります。

public struct Coordinate 
{ 
    public Coordinate(double latitude, double longitude) : this() 
    { 
     Latitude = latitude; 
     Longitude = longitude; 
    } 

    public double Latitude { get; private set; } 
    public double Longitude { get; private set; } 
} 
1

は、あなたはあなたが正しい16を返し

System.Runtime.InteropServices.Marshal.SizeOf(new Coordinate()); 

使用してサイズを見つけることができます。サイズを増やすことなくプロパティを追加できます。

+0

これは、2バイトのプロパティを使用すると、16バイト未満のものを示唆しているので、Microsoftのガイドラインが失敗することを意味しますか? – gcso

+0

16が16以上ではないので、厳密にはガイドラインには合致しません。おそらくあなたがそれらをどのように使用しようとしているかに依存します。 –

+0

返事をありがとう。私の仮定は正しい。 – gcso

1

これは危険な状況が必要になりますが、あなたは、progamaticallyそれを計算するためにsizeof(Coordinate)を使用することができます。たとえば

は、この構造体は、16バイトが必要です。あなたの場合、サイズは16バイトです。プロパティはラッパーだけなので、サイズにはカウントされません。構造体のサイズは、単にすべてのフィールドのサイズの合計です。

1

まず、構造体のサイズを調べるには、メンバーのサイズの合計を返すMarshal.SizeOf(struct)を使用します。マイクロソフトでは、構造体be below 16 bytesのサイズを推奨していますが、それは本当にあなた次第です。構造体に関連するオーバーヘッドがあります。構造体のメンバーが参照型を持つ場合は、参照型のインスタンスのサイズ(参照のサイズのみ)を含めないでください。

関連する問題