c# - 为什么 Struct 中属性的顺序会改变实例的大小?

标签 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我可以理解开销分配确实发生了。但是,为什么不一致呢?为什么结构内属性的顺序决定了其实例的大小?

最佳答案

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

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

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

To align the data, it may be necessary to insert some meaningless bytes between the end of the last data structure and the start of the next, which is data structure padding.

也许我们有这样的东西:

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
}

关于c# - 为什么 Struct 中属性的顺序会改变实例的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191756/

相关文章:

c# - Entity Framework 中的异常处理

c# - Apple 的 Windows 版 Bonjour SDK

c# - 将 float 和 double 值与 delta 进行比较?

具有静态方法的 C# 类实例与静态类内存使用

C内存管理错误?

c++ - 最大 malloc 大小低于预期

c# - 我可以使用 eBay API 获取 eBay 订单的 PayPal 交易 ID 吗?

c# - 同时等待多个任务的设计模式

c# - 使用 LinqToSql 生成返回数据库记录?

C# 查找两个字符串之间匹配单词的百分比