结构如何存储在内存中?

时间:2013-11-25 16:24:32

标签: c++ arrays struct null unions

我的代码中有struct iof_header,我确定它将是24字节宽。我执行sizeof(iof_header)并返回32字节宽。

问题1 为什么它是32字节而不是24?

问题2 包括其成员,如何将结构存储在内存中?

问题3 我发现任何时候我都会创建一个字节[4-8& 20-24]都是NULL,我在char数组中看到这一点。该数组如下所示{4 bytes of BASEID_Code, 4 NULL bytes, 8 bytes of zeroed padding, 4 bytes of ASID_Code, 4 NULL bytes, 8 bytes of size} 我的unsigned __int32成员的末尾有空字节,为什么会这样?

这可能与编译相关吗?使CPU能够更快地处理这些数据类型可能是一种有效的方法吗?

struct                      iof_header
{
    union
    {
        struct
        {
            unsigned __int32        BASEID_Code;
            unsigned __int64        padding;
            union
            {
                char                    ASID_Type[4];
                unsigned __int32        ASID_Code;
            };
            unsigned __int64        Size;
        }header;
        char                    header_c[24];
    };
    iof_header()
    {
        header.ASID_Code = 0;
        header.BASEID_Code = 0;
        header.Size = 0;
        header.padding = 0;
    }
};

2 个答案:

答案 0 :(得分:5)

  

为什么它是32字节而不是24?

可能是因为在每个__int64成员之前添加了填充以满足其对齐要求。

  

包括其成员,结构如何存储在内存中?

成员按顺序存储,必要时插入填充,以便相对于结构的开头正确对齐每个成员。

某些编译器具有非标准扩展名来“封装”成员,因此不会插入填充。例如,在GCC上,您可以在结构定义之后添加__attribute__((packed))

  

使CPU能够更快地处理这些数据类型可能是一种有效的方法吗?

是。在某些处理器上,未对齐的访问速度很慢;在其他方面,它们根本不被允许,必须通过两次或多次访问来模拟。

答案 1 :(得分:2)

编译器可以在成员之后添加填充字节以保留对齐要求。您的__int64成员可能会与8个字节对齐,而不是BASEID_Codepadding之间的4个填充字节。