2017-07-10 14 views
0

と一致していません。このヘッダー定義に基づいて、構造体は72バイトの大きさに見えます。しかし、ときに私は(私はこれらの構造体の配列へのIntPtrを取得する)C#でそれをマーシャルとのIntPtrが示すメモリを見て、私はこれを参照してください。あなたが見ることができるように、あるCOM相互運用構造定義は、COMヘッダ(vds.h)で定義された構造体があり、メモリレイアウト

0x01717A50 a8 c5 af 28 37 e1 0d 43 -> diskId 
0x01717A58 b0 87 e2 ef 94 5f 9f 27 -> diskId 
0x01717A60 02 00 00 00 00 00 00 00 -> first 4 bytes are extent type, second 4? 
0x01717A68 00 00 70 23 00 00 00 00 -> offset 
0x01717A70 00 00 50 4d 74 00 00 00 -> size 
0x01717A78 38 3c 22 26 e9 de df 44 -> volumeId 
0x01717A80 81 f3 ba ee af e2 ad 2b -> volumeId 
0x01717A88 48 98 78 bb 7f dd bc 41 -> plexId 
0x01717A90 94 17 db d2 86 01 54 ce -> plexId 
0x01717A98 00 00 00 00 00 00 00 00 -> first 4 bytes are membderIdx, second 4? 

を2 4説明されていないバイト領域。私はそれが8バイトだとは思わないので、C++のenumはtypedef enum _VDS_DISK_EXTENT_TYPE {のように宣言されています。 memberIdxと同じですが、ULONGとして宣言されているので、4バイトです。このパディングはどこで定義されていますか、または各フィールドのオフセットはどこに定義されていますか?メモリ内の各オブジェクトを表示し、フィールド間の実際の境界がどこにあるかを把握する必要がある場合、このCOMアセンブリのオブジェクトを使用することはほとんど不可能です。

答えて

1

これは、構造体のアラインメントの場合のようです。具体的には、この構造体は、Visual C++のデフォルトである8バイトのアライメントでコンパイルされました。各メンバーは8バイトの境界から始まることに注意してください。連続するメンバーが8バイトより小さい場合(たとえば、2つの連続するULONG)、最初のULONGに余分なパディングは表示されません(4バイトのメンバーは、アラインメント値> = 4)。しかし、ULONGとそれに続くULONGLONGがあるので、メンバは、次のように埋め込まれます。つまり、8バイトのメンバは4バイトの境界に揃えられないため、メンバは8バイトの境界に揃えられます。

https://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx

関連する問題