对于结构和类,有
offsetof
宏和 sizeof
运算符。
sizeof
可以用#define field_name_size n
来模拟,但是对于offsetof
我担心使用#define field_name_offset
会变得太麻烦,因为那时似乎必须使用一些复杂的公式来考虑所有前面的成员位字段。
在某些情况下,它可以帮助人们克服手动保持代码与位字段定义同步的需要,而这很容易失败。
一个示例是对位字段成员的互锁写入,其中需要使用自定义函数来写入此类成员,因为编译器不提供此类功能。
此外,我了解编译器实现位字段布局的方式可能略有不同。此类宏/运算符的可用性也将减少该问题的影响。
有没有办法获得位字段的类似功能,以便可以查询位字段成员的位偏移量和位大小?
不,没有办法实现这一点。位大小偏移量无法从位域成员中推断出来。
此外
sizeof()
将始终返回基础类型的大小,最小值为 char
,因此 1 是您将检索的最小大小。
不,没有。这是您应该避免使用位域并使用算术和完整的可寻址整数类型执行自己的位数组和类似操作的众多原因之一。
@Victor Suarez 创建了一个甜蜜的 constexpr 解决方案原型,他在其中创建了类型和 unsigned[] 的并集,然后操作位域并在 unsigned[] 中搜索效果。草案不完整,但它表明:这是可能的,而且基本上有效/将会有效。