Определен ли sizeof (bool) в стандарте языка C ++?

115

Не могу найти ответ в стандартной документации. Требует ли стандарт языка C ++ sizeof(bool)всегда быть 1 (для 1 байта) или этот размер определяется реализацией?

0xbadf00d
источник

Ответы:

167

sizeof(bool) определяется реализацией, и в стандарте этому факту уделяется особое внимание.

§5.3.3 / 1, сокращенный:

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

Сноска 69):

sizeof(bool) не обязательно должно быть 1.

GManNickG
источник
есть ли флаг, с которым мне нужно скомпилировать мою программу, для которого мой компилятор будет использовать только 1 байт bool?
Eagle
3
@Eagle: Это зависит от вашего компилятора, я не уверен. Вероятно, лучше оставить это своему компилятору.
GManNickG
5
обратите внимание, что стандарт std :: vector <bool> оптимизирован для вектора, содержащего 1 бит bool.
user3063349
15

http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx

«В Visual C ++ 4.2 заголовочные файлы Standard C ++ содержали typedef, приравнивающий bool к int. В Visual C ++ 5.0 и более поздних версиях bool реализован как встроенный тип размером 1 байт. Это означает, что для Visual В C ++ 4.2 вызов sizeof (bool) дает 4, а в Visual C ++ 5.0 и более поздних версиях тот же вызов дает 1. Это может вызвать проблемы с повреждением памяти, если вы определили элементы структуры типа bool в Visual C ++ 4.2 и смешиваете объект файлы (OBJ) и / или библиотеки DLL, созданные с помощью компиляторов 4.2 и 5.0 или более поздних версий ".

Йи Лин
источник
2
Вы понимаете, что это отчасти связано с вопросом, но явно не является ответом, поскольку 0xbadf00d спрашивал о стандарте, а не о какой-то конкретной / произвольно выбранной реализации компилятора, верно?
Christopher Creutzig
13
@ChristopherCreutzig Это доказательство контрпримером.
kinokijuf
12
@kinokijuf Это не контрпример. В Visual C ++ есть много вещей, которые не соответствуют стандартам.
0xbadf00d
11

Его реализация определена. Только sizeof(char)это 1стандарт.

Пеоро
источник
2
Пожалуйста, обратите внимание, что 1 в стандарте может означать 4 байта. Тогда каждый тип является продуктом 4. Так что позаботьтесь о том, чтобы стандарт ТОЛЬКО определял char как 1, но не определял измерение.
user3063349
1 означает 8 бит или 1 байт в стандарте
paulm 01
11
1 байт. Количество бит на байт не определено стандартом (оно должно быть не менее 8 IIRC), но может быть найдено в CHAR_BIT, определено в climits.
peoro 02
3

См. Пункт 1 раздела 5.3.3:

[Примечание: в частности, sizeof (bool) и sizeof (wchar_t) определяются реализацией.69)]

BЈовић
источник