Почему char и bool одинакового размера в С++?

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

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