有没有办法控制C中的结构体之间的填充(包括位域)?

前端之家收集整理的这篇文章主要介绍了有没有办法控制C中的结构体之间的填充(包括位域)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在解析网络数据流,我想知道是否有任何方法可以将数据流直接映射到数据结构.

例如,我想如下定义RTP协议的数据结构.

@H_502_4@class RTPHeader { int version:2; // The first two bits is version. int P:1; // The next bits is an field P. int X:1; int CC:4; int M:1; int PT:7; int sequenceNumber; int64 timestamp; ..... };

并以这种方式使用它.

@H_502_4@RTPHeader header; memcpy(&header,steamData,sizeof(header));

但是,由于C编译器将在成员之间插入填充,是否有任何方法来控制,以便在成员之间不添加填充(包括位字段成员)?

这个问题不是How to get rid of padding bytes between data members of a struct的重复,因为我的例子中可能有位字段.

解决方法

只要你不要求这个代码在任意机器上“工作” – 例如.对于int位于什么字节边界(通常为4字节边界),然后使用有限制的机器 @H_502_4@#pragma(pack)

应该是工作,它是supported in GCC以及微软和“微软插件兼容”编译器(如英特尔的编译器).

但请注意,所有处理器不支持未对齐的访问,因此启动具有16位值的块,后跟32位int可能会导致问题.

我还将使用一个大小的整数作为序列号,以确保它在每个编译器中是32位,而不是突然的16位或64位.

还要注意的是,C标准没有说明关于这些位存储在位域中的顺序的任何内容 – 或者如果它们之间存在差距,那么这一点也是如此.尽管您可以期望根据字节顺序存储位字段(小端机首先以最低位开始,大端机首先以最高位开始),但在该方面,该标准不表示任何内容.

原文链接:https://www.f2er.com/c/112603.html

猜你在找的C&C++相关文章