Байт - это наименьшая адресуемая единица памяти.
Рассмотрим следующий код:
bool b[9];
bool *pb0 = &b[0];
bool *pb1 = &b[1];
for (int counter=0; counter<9; ++counter)
{
// some code here to fill b with values
b[counter] = true;
}
Если bool хранится как 1 бит, то pb0 будет равно pb1, потому что оба имеют одинаковый адрес. Это явно не желательно!
Кроме того, присвоение в цикле приведет к нетривиальному коду сборки. Это будет включать разные битовые смещения в каждой итерации цикла. В высокопроизводительном программном обеспечении эти дополнительные операции сдвига битов могут без необходимости замедлять работу приложения.
Библиотека STL обеспечивает обходной путь в ситуациях, когда пространство имеет значение. Использование std :: vector будет хранить bool как 1 бит. Парадокс вышеприведенного примера неприменим, потому что
- перегрузка оператора [] скрывает строгость операции битового сдвига
- использование итераторов вместо указателей дает дополнительную гибкость реализации