Почему sizeof (bool) не определяется как один, самим стандартом?

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

С++ 03 Стандарт $5.3.3/1 говорит,

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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