我的结构定义如下:
public struct champ
{
public uint mem1;
public byte[] mem2;
public champ(int x)
{
mem1 = x;
mem2 = new byte[15];
}
}
创建对象后
champ sample = new champ (2);
应用Marshal.SizeOf(sample)返回4 4 = 8而不是415.为什么?
如果它是一个类,我可以理解该逻辑,因为第二个成员是一个占用4个字节的指针,该指针指向堆上的字节数组mem2.为什么会在结构上发生这种情况?
解决方法:
mem2字段没有MarshalAs属性,因此使用默认编组.这就是指向第一个元素的指针.
您可能打算写:
public struct champ
{
public uint mem1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] mem2;
public champ(int x) { ... }
}
结构的大小为20,因为对齐规则意味着在结构的末尾添加了一个额外的填充字节.需要确保该结构的大小是uint大小的4的精确倍数.这样可以确保该结构的数组可以正确对齐mem1.