Почему логическое значение часто занимает целый байт
Для ответа «да» или «нет» действительно хватает одного бита. Но обычная память и процессор работают не только с отдельными битами: минимальная адресуемая ячейка во многих системах — байт, обычно состоящий из восьми битов. У каждого байта есть собственный адрес, поэтому с ним удобно обращаться как с отдельной переменной.
Если выделить булевой переменной целый байт, процессору проще прочитать её, записать новое значение и передать его между частями программы. Не нужно отдельно вычислять, где внутри общего набора битов спрятано нужное значение, и менять только его, сохраняя соседние.
Цена экономии — дополнительные действия
Представим массив из множества ответов «включено/выключено». При обычном хранении каждый элемент может занимать байт. Чтобы упаковать восемь ответов в один байт, программе придётся назначить каждому ответу позицию и извлекать его с помощью операций над битами — например, маскировать лишние биты и сдвигать нужный на первое место.
Такая упаковка экономит память, но усложняет чтение и изменение значений. При параллельной работе это тоже может иметь значение: изменение одного бита обычно затрагивает операции над байтом или машинным словом, в котором лежат и другие биты. Поэтому разработчики языков и компиляторов часто предпочитают простое и предсказуемое представление, а не максимальную плотность хранения.
Когда биты всё-таки упаковывают
Если важен размер — например, при хранении большой таблицы флагов, — программу можно устроить так, чтобы несколько логических значений делили один байт. Для этого используют битовые поля, битовые наборы или специальные контейнеры. Здесь экономия может быть существенной: чем больше элементов, тем заметнее разница между одним битом и одним байтом на каждый.
Итак, семь свободных битов — не обязательно забытый запас: это плата за удобный доступ к значению. А в структурах, где важнее вместимость, эту плату можно отменить, приняв дополнительные операции при работе с данными.






