为了账号安全,请及时绑定邮箱和手机立即绑定

C / C ++:强制位域顺序和对齐

C / C ++:强制位域顺序和对齐

C++ C
qq_花开花谢_0 2019-09-02 10:59:05
我读到结构中位字段的顺序是特定于平台的。如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:struct Message{  unsigned int version : 3;  unsigned int type : 1;  unsigned int id : 5;  unsigned int data : 6;} __attribute__ ((__packed__));在具有GCC编译器的英特尔处理器上,字段在显示时显示在内存中。Message.version是缓冲区中的前3位,然后Message.type是。如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

不,它不是完全便携的。结构的包装选项是扩展,并且它们本身不是完全可移植的。除此之外,C99§6.7.2.1第10段说:“单位内的位域分配顺序(从高阶到低阶或低阶到高阶)是实现定义的。”


例如,即使是单个编译器也可能根据目标平台的字节顺序不同地放置位字段。


查看完整回答
反对 回复 2019-09-02
?
青春有我

TA贡献1784条经验 获得超8个赞

从编译器到编译器,位字段差异很大,抱歉。

对于GCC,大端机器首先布置了大端,而小端机器首先布置了小端。

K&R说“结构的相邻[bit-]字段成员在依赖于实现的方向上被打包到依赖于实现的存储单元中。当另一个字段后面的字段不适合时...它可以在单元之间分割,或者单元可以是宽度为0的未命名字段强制填充......“

因此,如果您需要与机器无关的二进制布局,则必须自己完成。

最后一个语句也适用于填充引起的非位域 - 但是所有编译器似乎都有一些强制结构字节打包的方法,正如我在GCC中发现的那样。


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 664 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信