为什么Struct内部的属性顺序会改变实例的大小?

时间:2014-08-07 20:38:37

标签: c# .net memory-management

我有一个包含以下字段的结构

public struct Person
    {
        public int Age;
        public short Id;
        public byte Marks;
    }

当我初始化并检查内存大小时,我的大小为8。

Person instance = new Person {Age = 10, Id = 1,Marks = 75};
Console.WriteLine(Marshal.SizeOf(instance));

但是,当我更改下面的顺序并执行它时,我得到12的大小。

public struct Person
    {
        public byte Marks;//1 byte
        public int Age;//4
        public short Id;//2
    }

理想情况下,它应该是7个字节。但是,从这个链接msdn我可以理解开销分配确实发生了。但是,为什么它不一致?为什么struct中的属性顺序决定了它的实例的大小?

1 个答案:

答案 0 :(得分:3)

这可能是因为数据对齐a.k.a.数据结构填充。

E.g。在许多32位系统上int应该是一个内存偏移量,它是4的倍数。

来自http://en.wikipedia.org/wiki/Data_structure_alignment

  

要对齐数据,可能需要在最后一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,即数据结构填充。

也许我们有这样的事情:

public struct Person
{
    public int Age;     // 4 bytes
    public short Id;    // 2 bytes
    public byte Marks;  // 1 byte + 1 byte for padding
}

public struct Person
{
    public byte Marks; // 1 byte + 3 bytes for padding
    public int Age;    // 4 bytes
    public short Id;   // 2 bytes + 2 bytes for padding
}