我正在尝试理解位域。以下示例出现在 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 位未使用。为什么?不应该是unsigned char 类型中的位数 - 定义的位数?还是留给下一个分配单元边界的未起诉位数?

最佳答案

将所有字段声明打包到一行中会让人有点难以看清发生了什么。这是同样的事情,但重新格式化:

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 位(下一个 unsigned char 单元)。

关于c++ - 了解 C++ 中的位字段打包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23380247/

10-11 16:05