如何构造一个具有非常奇怪的位域排列的 C 结构/联合?

1 c packed bit-fields

我有以下内存布局(伪代码):

struct {
    union {
        fieldA : 45;
        struct {
            fieldB1  :  12;
            fieldB2  :  33;
        }
    }
    fieldC : 19;
}
Run Code Online (Sandbox Code Playgroud)

即,字段A的存储器有时可以用于其他目的(字段B1和B2)。我希望这个结构尽可能压缩,即大小为 64 位。

似乎无论我做什么(例如打包属性),联合总是在 fieldC 之前填充 3 位以获得 48 位(6 字节)(当然它也被填充)。

Kam*_*Cuk 5

如何构造一个具有非常奇怪的位域排列的 C 结构/联合?

64 位大小。

使用 typedef 或带有单个uint64_t. 使用位域操作为每个字段编写 getter 和 setter。

  • 但它是可靠的,特别是在不稳定的情况下(https://lwn.net/Articles/478657/)。人们一直在使用位掩码、#define 和枚举与硬件寄存器。 (4认同)