Рассмотрим класс с несколькими атрибутами 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 сжимаются в одном байте?





Вы можете использовать битовые поля. Работает с 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;
}
Другая альтернатива - std::bitset.
Обратите внимание, однако, что фактический макет этих полей определяется реализацией. Определение языка не требует их упаковки. Обычно они будут, но если это важно, проверьте это.
Если вы действительно заботитесь об экономии места, вам, вероятно, следует использовать 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
Именно то, что я искал! Спасибо! Я приму ответ, когда смогу.