Почему являются символ и bool тем же размером в C++?

Я читаю Язык Программирования на C++. В нем Stroustrup заявляет это sizeof(char) == 1 и 1 <= sizeof(bool). Специфические особенности зависят от реализации. Почему такое простое оценило бы, поскольку булевская переменная занимает то же место как символ?

31
задан Sebastian Mach 22 December 2011 в 13:04
поделиться

7 ответов

В архитектуре современного компьютера байт является самой маленькой адресуемой единицей памяти. Упаковать несколько битов в байт требует применения дополнительных операций сдвига разряда. На уровне компилятора это - компромисс памяти по сравнению с требованиями к скорости (и в высокоэффективном программном обеспечении, те дополнительные операции сдвига разряда могут сложить и замедлить приложение напрасно).

66
ответ дан 27 November 2019 в 21:27
поделиться

Поскольку в C++ можно взять адрес булевской переменной, и большинство машин не может обратиться к отдельным битам.

20
ответ дан 27 November 2019 в 21:27
поделиться

Это занимает то же место, потому что самая маленькая сумма пространства, которое можно записать в памяти, является единственным байтом. Оба значения хранятся в байте. Хотя Вам теоретически только нужен 1 бит для выражения булева значения, у Вас все еще должен быть целый байт для хранения значения.

12
ответ дан 27 November 2019 в 21:27
поделиться

Теоретически Вам только нужен единственный бит для bool, но работающий меньше чем с 1-байтовой ценностью данных грязно. Вам нужно больше инструкций достигнуть чего-либо, и Вы действительно не извлекаете выгоду.

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

5
ответ дан 27 November 2019 в 21:27
поделиться

На самом деле, в большей части реализации, которую я знаю sizeof (bool) == sizeof (интервал). "интервал" предназначается, чтобы быть размером данных, который является самым эффективным, чтобы ЦП работал с. Следовательно вещами, которые не имеют определенного размера (как "символ") является тот же размер как интервал, Если у Вас было большое количество их на объект, можно хотеть реализовать средство упаковки их для устройства хранения данных, но во время нормального вычисления, это нужно оставить, это - собственный размер.

2
ответ дан 27 November 2019 в 21:27
поделиться

Существует эта вещь в C++, названном вектором, который пытается использовать то, что можно теоретически сохранить 8 bools в одном символе, но это широко рассматривается как ошибка комитетом по стандартам C++. В книге "эффективный stl" на самом деле говорится, "не используют его". Это должно дать Вам общее представление о том, насколько хитрый это.

BTW: Knuth имеет книга , просто выделенная битовым операциям. Повышение также имеет библиотека выделенный обработке больших количеств битов в большей памяти эффективный путь.

2
ответ дан 27 November 2019 в 21:27
поделиться

Байт является самой маленькой адресуемой единицей памяти.

Рассматривают следующий код:

    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 бит. Парадокс примера выше не применяется, потому что

  • перегрузка оператора [] скрывает суровость операции сдвига разряда
  • , использование итераторов вместо указателей дает дополнительную гибкость реализации
2
ответ дан 27 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: