1. 程式人生 > >C#.NET結構體字節對齊[轉載]

C#.NET結構體字節對齊[轉載]

第一個 屬性 設置 匯編 sum pos char bsp internal

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct DllInvoices
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public byte[] serial;
public byte Type;
public uint Sum;
}
調用Marshal.SizeOf(typeof(DllInvoices ))得到的大小為16,為什麽不是13?

這其實是體系結構和匯編的問題。

在內存裏特定類型數據的起始地址通常有一定的對齊要求,比如說32位機器上的int起始地址必須是4的整數倍,結構通常也是如此。
如果一個結構包含一個char和一個int,那麽char作為結構體的第一個字段,需要在4的整數倍地址開始,而int有同樣的要求,所以char之後必須空出3個字節來,才能使int的地址滿足對齊的要求。

.NET的CLR是基於32位的,所以也由上述要求。在你的byte之後,必須空出3個字節。所以

結果就是16個字節了。

可以通過StructLayout的Pack屬性改變這種對齊設置——如果有必要的話:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi,Pack=1)] 結果就是13了。

C#.NET結構體字節對齊[轉載]