Bit Field

位域

  • 显示表明对象尺寸(所占位数)
    struct Str {
      bool b1;
      bool b2;
    };
    
    struct Str2 {
      bool b1 : 1;
      bool b2 : 1;
    };
    
    int main() {
      sizeof(Str);  // 2, 2个字节,空间浪费
      sizeof(Str2);  // 1, 1个字节(中的两位),剩下的6个位闲置
    }
    
  • 多个位域对象可能会被打包存取
    • 上面的例子中,程序在处理Str2的时候会多执行1个步骤(取一个字节、位操作得到目标位的值),处理Str的时候只需要取对应的一个字节就行
    • 因此,为了效率用Str,为了省内存用Str2
  • 声明了位域的对象不能取地址,因此不能使用指针或非常量引用进行绑定
    • 不能取地址的原因是位域对象不一定在一个字节的开始处
    • 常量引用可以正常工作
      struct Str {
        bool b1 : 1;
      };
      Str s;
      const auto& ref = s.b1;  // 这里会把s.b1复制到一个字节大小的临时变量里,然后ref绑定到改临时变量
      
    • 这就是为啥遍历vector的对象只能用“auto&&”或“const auto&”
  • 位域指定的大小必须小于其类型的大小
    char a : 2;  // a的取值是0-3
    char a : 10;  // a的取值还是0-255
    a = 1024;
    std::cout << a;  // 0
    

Search

    欢迎添加我的微信

    闷骚的程序员

    Table of Contents