c语言结构体中由单个数据排序,C语言结构体存储及对齐

C语言中结构体对齐的规则

基本规则

规则1:结构体的数据成员中,第一个成员的Offset为0;

规则2:结构体的数据成员中,每个成员的Offset为本成员大小的整数倍;

规则3:若结构体A作为另一个结构体B的数据成员,则结构体A作为一个整体参与规则1和规则2;

规则4:结构体的总大小(sizeof)不是简单的所有成员大小的总和,为该结构体内部最大成员数据类型的整数倍,单个成员大小不够的参考规则2以最简方式进行在尾部补齐。

基本规则下的计算Workflow

Step1:对结构体所有数据成员的大小进行排序

Step2:参考规则4,先根据结构体中最大成员的大小,确定最初(也是最粗)的对齐边界,并放置最大的结构体成员;

Step3:参考Step2,基于在结构体中定于的顺序,相邻插入其次大小的成员变量,并以上次放置设定对齐边界进行对齐,然后更新本数据成员的对齐边界为当前的对齐边界;

Step4:重复Step3,直至放置完最后一个元素;

Step5:参考规则1,为放置好的元素从0开始设定Offset。

考虑pack的情况

在使用了#pragma pack(x)宏配置之后,将修正基本规则中的规则4和规则2,结构体的各数据成员大小及总大小将以宏配置参数x决定。

例如若使用了#pragma pack(2)则对齐的基准将是2,此时可以直接从结构体中的第一个成员开始依次计算Offset,只要保证各自的对齐满足由宏参数(在本例中为2)指定大小的整数倍即可。

考虑大小端的情况

大小端是数据元素内部组织数据的方式,不影响宏观的结构体的存储划分。

补充说明

在嵌入式开发中,对内存的管理非常严格,大小端和结构体存储的安排是个非常敏感的话题,并且不同设备使用的标准在事实上存在差异并广泛存在(例如广泛使用的ARM处理器使用的是小端对齐,而广泛使用的网络数据流对数据的保存则使用大端对齐)。实际上,在实际的开发中,尤其是面向数据流的处理时,这些就是必须要考虑的问题了。为了考虑程序和设备的兼容性,使用#pragma pack宏配置命令依赖于编译器,并不是一个很好的选择,建议将数据序列化成基本的字节流,将结构体定义字段的偏移量作为索引进行访问,这样可以避免在数据传输中的大小端转换的问题。但在某些具体的应用中,使用专门的大小端转换函数也是有必要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值