Почему sizeof (bool) не определен как единица самим стандартом? - PullRequest
34 голосов
/ 21 февраля 2011

Размер char, signed char и unsigned char определяется как 1 байт самим стандартом C ++. Мне интересно, почему он не определил sizeof(bool) также?

C ++ 03 Standard $ 5.3.3 / 1 говорит,

sizeof (char), sizeof (подписанный char) и sizeof (без знака) 1; результат sizeof применяется к любому другому Основной тип (3.9.1) реализации. [Примечание: в в частности, sizeof (bool) и sizeof (wchar_t) от реализации .69)

Я понимаю, что sizeof (bool) не может быть меньше одного байта . Но есть ли обоснование, почему оно должно быть больше 1 байта? Я не говорю, что реализации определяют, что он больше 1, но Стандарт оставил его для определения реализацией , как если бы он мог быть больше 1.

Если нет причины sizeof(bool) быть больше 1, тогда я не понимаю, почему Стандарт не определил его как просто 1 byte, как он определил sizeof(char), и это все варианты.

Ответы [ 4 ]

27 голосов
/ 21 февраля 2011

Другим вероятным размером для него является int, являющийся "эффективным" целочисленным типом для платформы.

В архитектурах, где не имеет значения, выберет ли реализация 1 или sizeof(int)может быть компромисс между размером (но если вы рады потратить 7 бит на bool, почему бы вам не радоваться потере 31? Используйте битовые поля, когда размер имеет значение), с производительностью (но когда хранится изагрузка значений bool будет реальной проблемой производительности? Используйте явно int, когда скорость имеет значение).Таким образом, гибкость реализации выигрывает - если по какой-то причине 1 будет ужасным с точки зрения производительности или размера кода, он может избежать этого.

23 голосов
/ 21 февраля 2011

Как отмечает @MSalters, некоторые платформы работают более эффективно с большими элементами данных.

Многим процессорам "RISC" (например, MIPS, PowerPC, ранним версиям Alpha) было / было значительно сложнее работать с данными размером менее одного слова, поэтому они делают то же самое. IIRC, по крайней мере с некоторыми компиляторами на Alpha a bool, фактически занимал 64 бита.

gcc для PowerPC Mac по умолчанию использовал 4 байта для bool, но имел переключатель, чтобы изменить его на один байт, если вы хотите.

Даже для x86 есть преимущество использования 32-битного элемента данных. gcc для x86 имеет (или, по крайней мере, раньше имел - я совсем недавно не смотрел) определение в одном из своих файлов конфигурации для BOOL_TYPE_SIZE (исходя из памяти, так что я могу немного ошибочно назвать это имя) что вы можете установить значение 1 или 4, а затем повторно скомпилировать компилятор, чтобы получить bool такого размера.

Edit: По этой причине я бы сказал, что это простое отражение базовой философии C и C ++: оставьте для реализации как можно больше возможностей для оптимизации / настройки ее поведения. Требовать особого поведения только тогда, когда / если есть очевидное, ощутимое преимущество и вряд ли будут какие-либо серьезные обязательства, особенно если изменение усложнит поддержку C ++ на некоторой конкретной платформе (хотя, конечно, если платформа достаточно может быть проигнорировано).

19 голосов
/ 21 февраля 2011

Многие платформы не могут эффективно загружать значения меньше 32 бит. Они должны загрузить 32 бита и использовать операцию сдвига и маски для извлечения 8 бит. Вы не хотели бы этого для одиночных bool s, но это нормально для строк.

1 голос
/ 15 января 2014

Операция, приведшая к 'sizeof', - это MADU (минимальная адресуемая единица), а не байты. Итак, семейство процессоров C54 *. C55 * Texas Instuments, выражение 1 MADU = 2 байта.

Для этой платформы sizeof (bool) = sizeof (char) = 1 MADUs = 2 байта. Это не нарушает стандарт C ++, но проясняет ситуацию.

...