为什么不能在不同的基础类型之间拆分位域?
Why can't a bit field be split between different underlying types?
为什么这两个结构的大小不同?
#pragma pack(push, 1)
struct WordA
{
uint32_t address : 8;
uint32_t data : 20;
uint32_t sign : 1;
uint32_t stateMatrix : 2;
uint32_t parity : 1;
};
struct WordB
{
uint8_t address;
uint32_t data : 20;
uint8_t sign : 1;
uint8_t stateMatrix : 2;
uint8_t parity : 1;
};
#pragma pack(pop)
不知何故,WordB
占用 6 个字节而不是 4 个字节,而 WordA
恰好占用 32 位。
我假设给定一个结构内使用的位的总和将产生两个结构具有相同的大小。显然我错了,但我找不到原因的解释。
Bit fields 页面仅显示所有结构成员均为同一类型时的示例,即 WordA
.
的情况
任何人都可以解释为什么尺寸不匹配以及它是根据标准还是实现定义的?
Why can't a bit field be split between different underlying types?
在标准允许的意义上可以。
它不是,因为这是语言实现者(或者更确切地说,ABI 的设计者)选择的。这个决定可能是首选,因为它可以使程序更快或编译器更容易实现。
这里是标准报价:
[class.bit]
... Allocation of bit-fields within a class object is implementation-defined.
Alignment of bit-fields is implementation-defined.
Bit-fields are packed into some addressable allocation unit.
为什么这两个结构的大小不同?
#pragma pack(push, 1)
struct WordA
{
uint32_t address : 8;
uint32_t data : 20;
uint32_t sign : 1;
uint32_t stateMatrix : 2;
uint32_t parity : 1;
};
struct WordB
{
uint8_t address;
uint32_t data : 20;
uint8_t sign : 1;
uint8_t stateMatrix : 2;
uint8_t parity : 1;
};
#pragma pack(pop)
不知何故,WordB
占用 6 个字节而不是 4 个字节,而 WordA
恰好占用 32 位。
我假设给定一个结构内使用的位的总和将产生两个结构具有相同的大小。显然我错了,但我找不到原因的解释。
Bit fields 页面仅显示所有结构成员均为同一类型时的示例,即 WordA
.
任何人都可以解释为什么尺寸不匹配以及它是根据标准还是实现定义的?
Why can't a bit field be split between different underlying types?
在标准允许的意义上可以。
它不是,因为这是语言实现者(或者更确切地说,ABI 的设计者)选择的。这个决定可能是首选,因为它可以使程序更快或编译器更容易实现。
这里是标准报价:
[class.bit]
... Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined. Bit-fields are packed into some addressable allocation unit.