有一点结构。是否可以在编译时找出该结构字段的大小(以位为单位)?结构本身就在一边,您无法更改其代码。
// Код, недоступный для изменения.
#pragma pack( push, 1 )
struct Foo {
uint16_t field_a : 12;
uint8_t field_b : 6;
uint8_t field_c: 8;
};
#pragma pack( pop )
// Как получить размер field_b структуры?
size_t size_of_field_b = ???; // Должны получить 6.
没有可移植的(在 C++ 编译器的所有实现中工作)方法来找出位字段的大小(位数)。有一些方法可能有效,但在一般情况下不能保证。
可用于计算位域大小的基本概念是找到可写入该位域的最大值,该最大值表示为该域分配的可能位数。但是,应考虑以下限制:
如果您将一个值分配给一个不明确适合其中的位字段,它很可能会被简单地截断,但实现可以自由选择不同的行为。例子:
for clang 将打印一条关于将 127 截断为 63(可以存储在 6 位中的最大值)的警告:
位域的指定大小可以超过底层类型的位宽,例如:
在这种情况下,不适合基础类型的位将无法通过位域获得,并且将充当占位符,直到封闭类的下一个成员或结尾。可能的警告:
那。尽管位字段的大小设置为 16,但在字段中写入超过 8 位的值是行不通的。因此,通过写入“最大值”来确定大小是行不通的.
如果我们假设上述限制不适用于我们的案例,那么代码可以是这样的(基于wololo评论中的代码):
结论: