C++:是否有可能在同一个字节内压缩`bool`对象?

Rem*_*i.b 10 c++ memory byte boolean bit

考虑一个具有许多bool属性的类

class A
{
  bool a;
  bool b;
  bool c;
  bool d;
  bool e;
  bool f;
};
Run Code Online (Sandbox Code Playgroud)

虽然每个bool对象可以用一个位表示,但这里每个属性都需要一个字节(如果我没有记错的话).该对象将占用6个字节而不是仅仅1个字节(其中将实际使用6个字节).原因是位不可寻址,只有字节.

为了使存储器稍微冷凝,可以使用a vector<bool>或a bitset然后通过它们的索引访问属性.例如,可以将get函数编写为

bool A::get_d() {data[3];}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望能够直接访问属性InstanceOfA.d.是否可以这样做,同时确保我的所有6个bool都在同一个字节内被压缩?

Phi*_*l M 12

您可以使用位域.与Repl.it的gcc版本4.6.3一起使用.

#include <iostream>

struct Test 
{
  bool a:1;
  bool b:1;
  bool c:1;
  bool d:1;
  bool e:1;
  bool f:1;
  bool g:1;
  bool h:1;
  //bool i:1; //would increase size to 2 bytes.
};

int main()
{
  Test t;
  std::cout << sizeof(t) << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 另一种选择是`std :: bitset`. (6认同)
  • 但请注意,这些字段的实际布局是实现定义的.语言定义不要求打包它们.通常它们会是,但如果它很重要,请检查它. (4认同)