【问题标题】:offsetof and sizeof like functionality for bit fields位域的 offsetof 和 sizeof 类似功能
【发布时间】:2016-07-22 03:02:38
【问题描述】:

结构和类有offsetof 宏和sizeof 运算符。
有没有办法让位域得到类似的功能,以便查询位域成员的位偏移位大小 ?

sizeof 可以用#define field_name_size n 模拟,但对于offsetof 恐怕用#define field_name_offset 会变得太麻烦,因为从那时起似乎必须使用一些复杂的公式来考虑所有前面的成员在位域中。

在某些情况下,它可以让人们克服手动保持代码与位字段定义同步的需要,这很容易出错。
一个例子是对位字段成员的互锁写入,其中需要使用自定义函数来写入此类成员,因为编译器不提供这种功能。
另外,我知道编译器可能会以不同的方式实现位域布局。此类宏/运算符的可用性也会减少该问题的影响。

【问题讨论】:

  • “有没有什么办法可以得到类似的位域功能,以便查询位域成员的位偏移和位大小?”我不知道一。
  • 真正混乱的部分是 C 规范允许位域跨越多个存储单元。所以在 32 位系统上struct { int x:20, y:20, z:20; } 可以占用 2 个整数或 3 个整数。
  • std::vector<bool> 专业化是失败的一个突出示例。

标签: c++ c bit-fields


【解决方案1】:

有没有什么方法可以得到类似的位域功能,以便查询位域成员的位偏移和位大小?

不,没有办法实现这一点。位大小偏移不能从位域成员中推断出来。

另外,sizeof() 将始终返回底层类型的大小,最小值为 char,因此 1 是您将检索的最小大小。

【讨论】:

    【解决方案2】:

    不,没有。这是您应该避免使用位域并使用算术和完整的、可寻址的整数类型做自己的位数组和类似操作的众多原因之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2012-05-20
      • 1970-01-01
      相关资源
      最近更新 更多