我正在尝试理解位域。以下示例出现在 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/