结构大小不能反映C#中正确的字节数

时间:2013-11-22 15:50:03

标签: c# pinvoke marshalling sizeof

我的结构定义如下:

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。为什么结构会发生这种情况?

2 个答案:

答案 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个字节)。