我的结构定义如下:
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(样本)返回4 + 4 = 8而不是4 +15。为什么呢?
如果它是一个类,我可以理解该逻辑,因为第二个成员是占用4个字节的指针,指向堆上的字节数组mem2。为什么结构会发生这种情况?
答案 0 :(得分:3)
mem2
字段没有MarshalAs
属性,因此使用默认编组。这是指向第一个元素的指针。
你可能想写:
public struct champ
{
public uint mem1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] mem2;
public champ(int x) { ... }
}
结构的大小将为20,因为对齐规则意味着在结构的末尾添加了额外的填充字节。这需要确保结构的大小是4的整数倍,即uint
的大小。这可以确保结构的数组正确对齐mem1
。
答案 1 :(得分:1)
public byte[] mem2
这是对堆上其他位置的数组的引用 引用的大小始终为4个字节(或64位进程中的8个字节)。