Я читаю Язык Программирования на C++. В нем Stroustrup заявляет это sizeof(char) == 1
и 1 <= sizeof(bool)
. Специфические особенности зависят от реализации. Почему такое простое оценило бы, поскольку булевская переменная занимает то же место как символ?
В архитектуре современного компьютера байт является самой маленькой адресуемой единицей памяти. Упаковать несколько битов в байт требует применения дополнительных операций сдвига разряда. На уровне компилятора это - компромисс памяти по сравнению с требованиями к скорости (и в высокоэффективном программном обеспечении, те дополнительные операции сдвига разряда могут сложить и замедлить приложение напрасно).
Поскольку в C++ можно взять адрес булевской переменной, и большинство машин не может обратиться к отдельным битам.
Это занимает то же место, потому что самая маленькая сумма пространства, которое можно записать в памяти, является единственным байтом. Оба значения хранятся в байте. Хотя Вам теоретически только нужен 1 бит для выражения булева значения, у Вас все еще должен быть целый байт для хранения значения.
Теоретически Вам только нужен единственный бит для bool, но работающий меньше чем с 1-байтовой ценностью данных грязно. Вам нужно больше инструкций достигнуть чего-либо, и Вы действительно не извлекаете выгоду.
, Если Вы хотите упаковать несколько булевских переменных в единственный байт, можно использовать структура битового поля .
На самом деле, в большей части реализации, которую я знаю sizeof (bool) == sizeof (интервал). "интервал" предназначается, чтобы быть размером данных, который является самым эффективным, чтобы ЦП работал с. Следовательно вещами, которые не имеют определенного размера (как "символ") является тот же размер как интервал, Если у Вас было большое количество их на объект, можно хотеть реализовать средство упаковки их для устройства хранения данных, но во время нормального вычисления, это нужно оставить, это - собственный размер.
Существует эта вещь в C++, названном вектором, который пытается использовать то, что можно теоретически сохранить 8 bools в одном символе, но это широко рассматривается как ошибка комитетом по стандартам C++. В книге "эффективный stl" на самом деле говорится, "не используют его". Это должно дать Вам общее представление о том, насколько хитрый это.
BTW: Knuth имеет книга , просто выделенная битовым операциям. Повышение также имеет библиотека выделенный обработке больших количеств битов в большей памяти эффективный путь.
Байт является самой маленькой адресуемой единицей памяти.
Рассматривают следующий код:
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, потому что у обоих есть тот же адрес. Это ясно не желательно!
Дополнительно присвоение в цикле приведет к non-trival ассемблерному коду. Это вовлечет другой сдвиг разряда в каждое повторение цикла. В высокоэффективном программном обеспечении те дополнительные операции сдвига разряда могут замедлить приложение напрасно.
библиотека STL обеспечивает обходное решение в ситуациях, где пространство ДЕЙСТВИТЕЛЬНО имеет значение. Использование станд.:: vector< bool> сохранит bool как 1 бит. Парадокс примера выше не применяется, потому что