Чи визначено 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?
Орел

3
@Eagle: Це залежить від вашого компілятора, я не впевнений. Це, мабуть, найкраще, щоб ви залишили це своєму компілятору.
GManNickG

5
зауважимо, що std :: vector <bool> оптимізовано до вектора, що містить 1-бітні булі за стандартом.
користувач3063349

15

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

"У Visual C ++ 4.2 стандартні файли заголовків 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 запитав про стандартну, а не якусь конкретну / довільно вибрану реалізацію компілятора, правда?
Крістофер Крейціг

13
@ChristopherCreutzig Це доказ контрприкладу.
kinokijuf

12
@kinokijuf Це не контрприклад. У Visual C ++ є багато речей, які не відповідають стандартам.
0xbadf00d

11

Це визначено реалізацією. Тільки sizeof(char)це 1стандарт.


2
pls зауважте, що 1 у стандарті може означати 4 байти. Тож будь-який тип - це продукт 4. Тому дбайте про те, щоб стандарт ТОЛЬКО визначав значення char 1, а не визначав вимірювання.
користувач3063349

1 означає 8 біт або 1 байт у стандарті
paulm

11
1 байт. Кількість біт на байт не визначається стандартом (воно повинно бути не менше 8 IIRC), але його можна знайти CHAR_BIT, визначене в climits.
пеоро

3

Див. Пункт 5.3.3 пункту 1:

[Примітка: зокрема, sizeof (bool) та sizeof (wchar_t) визначені реалізацією.69)]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.