加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 结构如何存储在内存中?

发布时间:2020-12-16 09:49:06 所属栏目:百科 来源:网络整理
导读:我的代码中有一个struct iof_header,我确定它将是24字节宽.我执行sizeof(iof_header)并返回32字节宽. 问题1 为什么它是32字节宽而不是24字节? 问题2 包括其成员,如何将结构存储在内存中? 问题3 我发现任何时候我都会创建一个字节[4-8 20-24]都是NULL,我在c
我的代码中有一个struct iof_header,我确定它将是24字节宽.我执行sizeof(iof_header)并返回32字节宽.

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

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

问题3
我发现任何时候我都会创建一个字节[4-8& 20-24]都是NULL,我在char数组中看到这一点.该数组读取如下{BASEID_Code的4个字节,4个NULL字节,8个字节的归零填充,4个字节的ASID_Code,8个字节的大小}
我的无符号__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;
    }
};

解决方法

Why is it 32 bytes wide instead of 24?

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

Including its members,how is a struct stored in memory?

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

某些编译器具有非标准扩展来“打包”成员,因此不插入填充.例如,在GCC上,您可以在结构定义之后放置__attribute __((packed)).

Possibly an efficiency thing to make the CPU able to process these data types faster?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读