了解C中的位域填充

我正在尝试理解bitfield.以下示例出现在
C++ online docs中.

#include <iostream>
struct S {
// will usually occupy 2 bytes:
// 3 bits: value of b1
// 2 bits: unused
// 6 bits: value of b2
// 2 bits: value of b3
// 3 bits: unused
unsigned char b1 : 3, : 2, b2 : 6, b3 : 2;
};
int main()
{
    std::cout << sizeof(S) << '\n'; // usually prints 2
}

关于这个例子,我不明白的是,在上面的注释代码中,据说在b1:3之后有2位未使用.然后在b3:2之后有3位未使用.为什么?不应该是无符号字符类型中的位数 – 定义的位数?还是未使用的位数留给下一个分配单元边界?

最佳答案 将所有字段声明打包到一行中会使得查看正在发生的事情变得有点困难.这是同样的事情,但重新格式化:

struct S {
  unsigned char b1:3;  // 3 bits - b1
  unsigned char   :2;  // 2 bits - unused
  unsigned char b2:6;  // 6 bits - b2
  unsigned char b3:2;  // 2 bits - b3
                       // Total: 13 bits
};                     // 3 bits - unused (implicit padding)

两个“未使用”部分是:(1)b1之后的未命名字段,显式宽度为2位; (2)结构末尾的填充将其四舍五入为16位(下一个无符号字符单元).

点赞