为什么这两个结构体的大小不同?
#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)
Run Code Online (Sandbox Code Playgroud)
不知何故WordB占用 6 个字节而不是 4 个,而WordA正好占用 32 位。我假设给定结构内使用位的总和会使两个结构具有相同的大小。显然我错了,但我找不到原因的解释。
位字段页面仅显示所有结构成员都属于同一类型时的示例,这是一种情况WordA.
任何人都可以解释一下,为什么尺寸不匹配,以及它是否符合标准或实现定义?
为什么不能将位字段拆分为不同的基础类型?
它可以是在标准允许的意义上。
这并不是因为语言实现者(或者更确切地说,ABI 的设计者)选择了这一点。这个决定可能是首选,因为它可以使程序更快或者编译器更容易实现。
以下是标准报价:
[类.位]
...类对象内位字段的分配是实现定义的。位字段的对齐是实现定义的。位字段被打包到一些可寻址的分配单元中。