DOBON.NET DOBON.NETプログラミング掲示板過去ログ

構造体のパディング

  • 題名: 構造体のパディング
  • 著者: Rose
  • 日時: 2012/02/08 11:21:10
  • ID: 29797
  • この記事の返信元:
    • (なし)
  • この記事への返信:
    • (なし)
  • ツリーを表示
環境/言語:[VB2008(.NET 3.5 + Win7/x64,Vista/x86)]
分類:[.NET]

http://msdn.microsoft.com/ja-jp/library/xh3e3fd0.aspxによると

バイト数を指定すると、2番目以降の構造体メンバーは、
メンバー型のサイズかnバイト境界 (n は 1、2、4、8、または 16 のいずれか)
のどちらか小さい方に格納されます。

とあり、これを基本に以下の構造体で実験してみました。

以下の構造体でPackサイズNに8と16を指定した場合
System.Runtime.InteropServices.Marshalクラスの
SizeOfとOffsetOfは同じになります。
オフセット値は上記の理屈により、理解できるのですが
Pack:=16の場合、最後のメンバV6の後に15byteパディングされると思いましたが
結果は7byte。これは、どのように理解すればよいでしょうか?
(32/64bitマシンで結果は同じ)


<StructLayout(LayoutKind.Sequential, Pack:=N)> _
   Private Structure PackN
        Dim v1 As Byte          '1byte
                    '1byteパディング
        Dim v2 As Int16    '2byte
        Dim v3 As Int32       '4byte
        Dim v4 As Int64        '8byte
        Dim v5 As Decimal       '16byte
        Dim v6 As Byte          '1byte
                    '7byteパディング
    End Structure 

-----------------結果-------------------------
Pack=8
Size :40
Byte v1              :Offset :0
Int16 v2             :Offset :2
Int32 v3             :Offset :4
Int64 v4             :Offset :8
System.Decimal v5    :Offset :16
Byte v6              :Offset :32
----------------------------------------------
Pack16
Size :40
Byte v1              :Offset :0
Int16 v2             :Offset :2
Int32 v3             :Offset :4
Int64 v4             :Offset :8
System.Decimal v5    :Offset :16
Byte v6              :Offset :32

DOBON.NET | プログラミング道 | プログラミング掲示板