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


115

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

Ответы:


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.


есть ли флаг, с которым мне нужно скомпилировать мою программу, для которого мой компилятор будет использовать только 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)]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.