4

デフォルトでは、C# の構造体は、基本的に、これらのタイプのオブジェクトは COM 相互運用に一般的に使用され、それらのフィールドは定義された順序のままである必要があるという理由で実装されて[StructLayout( LayoutKind.Sequential )]ます。クラスがLayoutKind.Auto定義されています。

私の質問は、構造体を明示的に指定する必要が[StructLayout( LayoutKind.Auto )]あります。これにより、デフォルトよりも利点が得られますか? つまり、構造体がstackで初期化されている場合、違いはありますか?つまり、GCは構造体を移動する必要はありませんか? また、構造体がヒープ上で初期化されている場合、つまりクラスの一部である場合に役立ちますか?

4

2 に答える 2

2

私が考えることができる唯一の利点は、構造体のメモリ使用量が少ないことです。しかし、そもそもそのような大きな構造体がある場合は、おそらくそれをクラスにリファクタリングする必要があります。

struct潜在的な問題は、byte[]usingにマーシャリングするMarshal.PtrToStructureことです。バイトの順序が期待どおりになることをどのように保証できますか?

これを行うと、解決している問題よりも多くの可能性のある問題が発生しているように見えます...フィールドの順序があなたにとって重要ではない場合は、それを実行してください。ただし、次に来る人はだけでは期待できないかもしれません。

于 2009-11-29T20:09:27.067 に答える
1

あまり効果がないと思いますが、メリットがあるかもしれません。私は通常、デフォルトに固執します。

基本的に、自動レイアウトを使用すると、CLR はデータを整列する方法を選択できるため、速度のためにスペースのトレードオフを行うことができます (これはプラットフォームにも依存し、整列を維持することは他のものよりも重要になる場合があります)。ただし、構造体はスタック上で、または複合ヘルパー構造 (KeyValuePair を考えてください) としても使用されることが多いため、通常、シーケンシャルはデフォルトとして意味があります。

于 2009-11-29T20:40:07.320 に答える