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

Hun*_*ter 5 .net c# memory-management

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

public struct Person
    {
        public int Age;
        public short Id;
        public byte Marks;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

public struct Person
    {
        public byte Marks;//1 byte
        public int Age;//4
        public short Id;//2
    }
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*exD 3

这可能是因为数据对齐(又名数据结构填充)。

例如,在许多 32 位系统上,int内存偏移量应该是 4 的倍数。

来自http://en.wikipedia.org/wiki/Data_struct_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
}
Run Code Online (Sandbox Code Playgroud)