5
public struct TestStruct
{
    public int first;
    public int second;
    public int third;
}

Marshal.SizeOf は 12 を返します。これは、int がそれぞれ 4 バイトであるため、私が想定しているものです。3 番目を int ではなく double に変更すると、Marshal.SizeOf が 16 を返すことが期待されます。しかし、4 つ目の double を追加すると、Marshal.SizeOf は 24 を返しますが、20 を期待していました。しかし、3 int の後に double を追加すると、サイズが期待どおりになりません。

public struct TestStruct //SizeOf 12
{
    public int first;
    public int second;
    public int third;
}  

public struct TestStruct //SizeOf 16
{
    public int first;
    public int second;
    public double third;
}  

public struct TestStruct //SizeOf 24, but I feel like it should be 20
{
    public int first;
    public int second;
    public double third;
    public int fourth;
}

私の考えはどこで私を迷わせたのですか?

4

3 に答える 3

9

JimR の回答に加えて、 StructLayout 属性を使用してこの動作を明示的に変更できます。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TestStruct // sizeof is now 20
{
    public int first;
    public int second;
    public double third;
    public int fourth;
}

この構造体が順番に配置され、パッキング タイプが 1 であるべきであることをコンパイラに伝えました。これは、すべてのフィールドが互いに直接配置されることを意味します。パック 0 (デフォルト) は、現在のプラットフォームのパディングを使用するようにコンパイラに指示します.. 他のもの (2 の倍数) は、それらの特定の境界に配置されます。ただし、これには反対することをお勧めします..使用状況によっては予測不能になる可能性があります。

詳細については、次の MSDN 記事を参照してください: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.pack.aspx

于 2012-08-23T03:40:42.587 に答える
6

構造に入れられるパディングは考慮していません。

場合によっては、CPU がそのサイズの倍数で何かを読み取る方が効率的です。たとえば、一部の CPU は、4 バイト境界に整列された int のようなものです。一部の CPU は、int がアラインされていない場合、2 回の読み取りを発行する必要があります。

int、float、および double は、Intel プロセッサの SSE タイプの命令によって影響を受ける可能性がある場合、アライメントに特に敏感です。

于 2012-08-23T03:33:46.863 に答える
4

その答えは、データ フィールドの配置にあると思います。

たとえば、デフォルトでは、C# で定義された構造体には次の属性があります。

[StructLayout(LayoutKind.Sequential)]

LayoutKind.Sequential の定義を見ると、次のように記載されています。

LayoutKind 列挙体

オブジェクトのメンバーは、アンマネージ メモリにエクスポートされたときに表示される順序で、順番に配置されます。メンバーは StructLayoutAttribute.Pack で指定されたパッキングに従って配置され、連続していなくてもかまいません。

代わりにこの属性を指定する場合:

[StructLayout(LayoutKind.Auto)]

期待するサイズ - 20 が得られます。

于 2012-08-23T03:41:21.177 に答える