【问题标题】:Bit fields and pragmas位域和编译指示
【发布时间】:2011-12-20 13:31:11
【问题描述】:

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

两者都很容易修复 - 特别是对于填充,我只需要在我的网络结构周围添加 pragma:

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

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

另外,我在 C++ 代码中没有遇到太多位域 - 它们更像是 C 的东西,用得不多,还是我只是碰巧在不使用它们的代码上工作?

【问题讨论】:

  • 您只是没有碰巧处理使用位域的代码。它们在在适当的地方非常有用。合适的地方虽然少而具体。

标签: c++ bit-fields


【解决方案1】:

不,位域对于外部表示(例如网络数据包定义)来说是一个糟糕的选择。完全由编译器来选择位域在内存中的布局(位的排序方式、为给定域保留多少字节等等),因此您绝对会扼杀互操作性。

也就是说,出于您遇到的原因,我也反对为此使用“裸”结构。

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

【讨论】:

  • 是的,我们的大多数接口都使用某种序列化格式(尽管我们选择了非常不方便的格式)。这个没有问题的界面肯定更成问题,所以我现在看到了更多的好处。
  • 补充答案:#pragma pack 是一个编译指示,这意味着它可能不会出现在所有机器上,并且可移植代码不能依赖它。更有理由不使用裸结构(甚至不使用裸结构 int,因为 int 的大小和表示可能因机器而异)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多