C ++: возможно ли сконденсировать объекты `bool` в одном байте? - PullRequest
0 голосов
/ 13 декабря 2018

Рассмотрим класс с количеством атрибутов bool

class A
{
  bool a;
  bool b;
  bool c;
  bool d;
  bool e;
  bool f;
};

Хотя каждый объект bool может быть представлен одним битом, здесь каждый атрибут будет занимать байт (если я не ошибаюсь).Объект будет занимать 6 байтов вместо 1 байта (из которых 6 бит будут фактически использованы).Причина в том, что биты не адресуемы, только байты.

Чтобы сконденсировать бит памяти, можно использовать vector<bool> или bitset и затем обращаться к атрибутам по их индексам.Например, можно написать функцию get как

bool A::get_d() {data[3];}

В идеале, мне бы хотелось иметь прямой доступ к атрибутам с помощью InstanceOfA.d.Возможно ли это сделать, при этом гарантируя, что все мои 6 bool сгущаются в одном байте?

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Если вы действительно хотите сэкономить место, вам, вероятно, следует использовать bitset вместо битового поля.

Вы можете увидеть этот ответ дляполное сравнение, но по существу битовое поле будет иметь некоторые издержки из-за своей структуры, и компилятор может на самом деле или не может упаковывать элементы вместе для экономии места.

Однако битовые наборы специально созданы для оптимизации распределения пространства, иТакже предлагаем некоторые полезные функции, специально предназначенные для битового тиддлинга.

Битовый набор логически представляет собой просто массив битов, но упакован для экономии места.Вы можете использовать его так:

std::bitset<8> bacon;
bacon.set();    // 11111111
bacon.reset(1); // 11111101 Note: counts index from the right

std::bitset<4> fancy (std::string("1111"));
fancy[1] = 0;      // 1101 Note: counts index from the right
fancy.test(1) == 0 // true
0 голосов
/ 13 декабря 2018

Вы можете использовать битовые поля .Работает с gcc Repl.it версии 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;
}
...