c++ - 了解 C++ 中的位字段打包

标签 c++

我正在尝试理解位域。以下示例出现在 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 位未使用。为什么?Shoudn'那是 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/

相关文章:

c++ - 矩阵类输入运算符重载 >> 在 C++ 中

c++ - C++替换功能

c++ - 在持续评估期间读取其生命周期之外的变量是否可诊断?

c++ - 一种将派生类型传递给基本成员模板函数的优雅方法?

C++ 标准库串行端口 (UART) 接口(interface)

c++ - * 和 + 分别等同于 && 和 ||在 boolean 操作数上?

c++ - 如何将 dll 位置更改为 Codelite 中的子目录?

c++ - 为什么临时对象可以绑定(bind)到 const 引用?

c++ -/usr/local/lib 中缺少符号链接(symbolic link)

C++ 通过引用传递静态数组和动态数组