2つのコードの結果を解釈する際に問題があります。StructLayoutAttribute.Packの混乱
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 0)]
struct MyStruct
{
public byte b1;
public char c2;
public int i3;
}
public class Example
{
public unsafe static void Main()
{
MyStruct myStruct = new MyStruct();
byte* addr = (byte*)&myStruct;
Console.WriteLine("Size: {0}", sizeof(MyStruct));
Console.WriteLine("b1 Offset: {0}", &myStruct.b1 - addr);
Console.WriteLine("c2 Offset: {0}", (byte*)&myStruct.c2 - addr);
Console.WriteLine("i3 Offset: {0}", (byte*)&myStruct.i3 - addr);
Console.ReadLine();
}
}
私はpublic char c2;
とConsole.WriteLine("c2 Offset: {0}", (byte*)&myStruct.c2 - addr)
をコメントアウトした場合上記の結果は
Size : 8
b1 Offset: 0
c2 Offset: 2
i3 Offset: 4
である;、私は
Size : 8
b1 Offset: 0
i3 Offset: 4
になるだろう今、私はデフォルトの2番目のシナリオを、説明できると思いますパッキングサイズは、パック= 0の場合のmyStructの最大要素サイズのサイズです。パディングの1バイト+ 3バイト+ 4バイト= 8です。
しかし、最初のシナリオでは同じことは考えられません。私の予想される結果は、(1バイト+ 3バイトのパディング)+(2バイトのchar + 2バイトのパディング)+(4バイトのint)です。したがって、合計サイズは4バイトのパッキングサイズ(intのサイズ)として12になり、それぞれのオフセットは0,4,8となります。
ここでは何が欠けていますか? (Xはあなたのタイプのアライメントである)X-バイトのチャンクであなたの構造体を読んで何かを考えることが役立つかもしれないアライメントを理解することが
おかげ
ありがとうございました。しかし、デフォルトではPack = 0は使用されていませんか?私は、デフォルトでオブジェクト内の最大の要素のサイズを意味すると考えました。 –
@HansPassantドキュメントによるとhttps://msdn.microsoft.com/de-de/library/system.runtime.interopservices.structlayoutattribute.pack(v=vs.110).aspxは「現在のデフォルトのパッキングサイズプラットフォーム "。 – ckuri
@ckuri MSDNでもこう言及しています。型のデフォルトの配置は、最大の要素のサイズです。私はこれを非常に混乱させることがわかります。 –