为什么不能在不同的基础类型之间拆分位字段?

Ser*_*nik 7 c++ bit-fields

为什么这两个结构体的大小不同?

#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.

任何人都可以解释一下,为什么尺寸不匹配,以及它是否符合标准或实现定义?

eer*_*ika 4

为什么不能将位字段拆分为不同的基础类型?

可以是在标准允许的意义上。

并不是因为语言实现者(或者更确切地说,ABI 的设计者)选择了这一点。这个决定可能是首选,因为它可以使程序更快或者编译器更容易实现。

以下是标准报价:

[类.位]

...类对象内位字段的分配是实现定义的。位字段的对齐是实现定义的。位字段被打包到一些可寻址的分配单元中。