11

シーケンシャルレイアウトの構造体がいくつかあります。

struct S1
{
  Guid id;
}

struct S2 
{
  Guid id;
  short s;
}

struct S3 
{
  Guid id;
  short s;
  short t;
}

Marshal.SizeOf上記の構造体タイプを呼び出すと、次のようになります。

Size:
S1 = 16, as expected.
S2 = 20, copied an instance to a byte array, it only occupies first 18 bytes.
S3 = 20.

私の質問は、S2のサイズが18ではなく20である理由です。この問題Guidは、が構造体にある場合にのみ発生します。

申し訳ありませんが、msdnから有用な情報を見つけることができません。タイプがメモリ内で占めるスペースのサイズを指定することは知ってMarshal.SizeOfいますが、サイズを4の倍数にするために2バイト余分に値する理由を知りたいです。

そして、どうすればこの「問題」を回避できますか?

どうもありがとう!

4

3 に答える 3

10

これは、構造体に暗黙の[StructLayout]が付加されているため、Packフィールドが重要なフィールドです。マーシャリングされた後、構造のメンバーがどのように整列されるかを指示します。Packのデフォルト値は8です。これは、サイズが8バイト以下のメンバーが整列されることを意味します。つまり、shortは2の倍数、intは4、longまたはdoubleは8のオフセットに揃えられます。

重要な点は、構造体の配列が作成されたときに、位置合わせが引き続き機能することです。より簡単な例でより簡単に示されます:

using System;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        Console.WriteLine(Marshal.SizeOf(typeof(Example)));
        Console.ReadLine();
    }
}
struct Example {
    public int a;
    public short b;
}

出力:8

メンバーはaサイズを強制的に増加させ、構造体で構造体が使用されている場合にintが4の倍数であるオフセットに整列するように、構造体に2つの余分なパディングバイトが追加されます。次の属性を適用して、結果を変更できます。

[StructLayout(LayoutKind.Sequential, Pack = 2)]
struct Example {
    public int a;
    public short b;
}

出力:6

a構造体が配列で使用されている場合、メンバーの位置がずれるようになりました。

Guidに戻ると、宣言からはわかりませんが、内部的には多数のメンバーで構成されています。最初のものはという名前のプライベートフィールド_aであり、intです。したがって、GUIDには4バイトの配置が必要です。したがって、構造体を配列で使用するときに構造体を適切に整列させるには、2バイトの追加のパディングバイトが必要です。18バイトを取得するには、S2でPack=1またはPack=2が必要です。

この回答では、構造体の背景と、.NETでの構造体の特別な扱い方について説明しています。

于 2012-09-24T21:24:57.170 に答える
0

StructLayoutAttribute構造体定義でを使用しているのがわかりません。したがって、それらがどのように「レイアウト」されているかはわかりません。彼らがシーケンシャルレイアウトを持っていることをどうやって見分けることができますか?

一部のソース:sizeof()構造は不明です。なんで?いつStructLayoutを明示的に指定する必要がありますか

于 2012-09-24T21:10:44.150 に答える
0

一部のアイテムはメモリ内で4バイト(または8バイト)の境界に揃える必要があるためだと思います。したがって、構造体はこのサイズの倍数になり、構造体の配列がすべて正しく整列されます。文字列を含む64ビットマシンでは、文字列は8バイトの倍数になります。GUIDは、64ビットでも4バイトの倍数しか必要としないようです。GUIDを含む構造体のサイズが4バイトの倍数でない場合、一部のGUIDは、これらの構造体の配列の4バイト境界にありません。私はあなたが「問題」を避けることができないと思います-なぜそれが問題なのですか?

于 2012-09-24T21:24:16.177 に答える