为什么结构的低级长度要长到 4 个字节?
Why do the low level length of structure longer to 4 bytes?
有结构:
[StructLayout(LayoutKind.Sequential)]
public struct WAVEFORMATEX
{
public ushort wFormatTag;
public ushort nChannels;
public ushort nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
};
public WAVEFORMATEX audioInfo = new WAVEFORMATEX();
为什么 Marshal.SizeOf(audioInfo) returns 20 而不是 16?
uint
喜欢在 4 字节边界上对齐,因此在 nSamplesPerSec
和 nAvgBytesPerSec
之间插入了 2 字节的填充。我假设另外两个字节在结构的末尾进行填充,以使其总大小也是四个字节的倍数。
要防止引入此填充,请将 StructLayout
属性的 Pack
字段设置为 1 或 2,例如:
[StructLayout(LayoutKind.Sequential, Pack=2)]
// ...
有结构:
[StructLayout(LayoutKind.Sequential)]
public struct WAVEFORMATEX
{
public ushort wFormatTag;
public ushort nChannels;
public ushort nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
};
public WAVEFORMATEX audioInfo = new WAVEFORMATEX();
为什么 Marshal.SizeOf(audioInfo) returns 20 而不是 16?
uint
喜欢在 4 字节边界上对齐,因此在 nSamplesPerSec
和 nAvgBytesPerSec
之间插入了 2 字节的填充。我假设另外两个字节在结构的末尾进行填充,以使其总大小也是四个字节的倍数。
要防止引入此填充,请将 StructLayout
属性的 Pack
字段设置为 1 或 2,例如:
[StructLayout(LayoutKind.Sequential, Pack=2)]
// ...