位字段和编译指示

时间:2011-12-20 13:31:11

标签: c++ bit-fields

我最近整合了在不同硬件架构上运行的两个应用程序 - 其中出现的问题包括网络字节排序问题和结构填充问题。

两者都很容易修复 - 具体来说,对于填充,我只需要在我的网络结构中添加编译指示:

#pragma pack(1)
struct {};
#pragma pack(0)

我昨天看到了几个与bitfields有关的问题,虽然我从未使用过。我想知道...通过使用位域定义结构来尝试停止填充是否更合适?在这种情况下,这会有所帮助吗?

另外,我还没有在C ++代码中遇到过很多位域 - 它们更像是一个没用过多的C语言,还是我刚刚碰巧处理不使用它们的代码?

1 个答案:

答案 0 :(得分:3)

不,位域是外部表示的可怕选择,例如网络数据包定义。完全取决于编译器选择位域存储器中的布局(以何种方式对位进行排序,为给定字段保留多少字节,等等),因此绝对会破坏互操作性。

那就是说,由于你遇到的原因,我也反对使用“裸”结构。

在我看来,正确的方法是手动逐个序列化/反序列化字段。