Почему char и bool одинакового размера в c ++? - PullRequest
31 голосов
/ 06 ноября 2008

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

Ответы [ 7 ]

66 голосов
/ 06 ноября 2008

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

20 голосов
/ 06 ноября 2008

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

12 голосов
/ 06 ноября 2008

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

5 голосов
/ 06 ноября 2008

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

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

2 голосов
/ 06 ноября 2008

Байт - это наименьшая адресуемая единица памяти.

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

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

  • перегрузка оператора [] скрывает строгость операции битового сдвига
  • использование итераторов вместо указателей дает дополнительную гибкость реализации
2 голосов
/ 06 ноября 2008

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

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

2 голосов
/ 06 ноября 2008

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

...