Sizeof (booléen) est-il défini dans le standard du langage C ++?

115

Je ne trouve pas de réponse dans la documentation standard. Le standard du langage C ++ doit-il sizeof(bool)toujours être 1 (pour 1 octet), ou cette taille est-elle définie par l'implémentation?

0xbadf00d
la source

Réponses:

167

sizeof(bool) est la mise en œuvre définie, et la norme met l'accent sur ce fait.

§5.3.3 / 1, abrégé:

sizeof(char), sizeof(signed char)et sizeof(unsigned char)valent 1; le résultat de sizeofappliqué à tout autre type fondamental est défini par l'implémentation. [Remarque: en particulier, sizeof(bool)et sizeof(wchar_t)sont définis par l'implémentation. 69) ]

Note de bas de page 69):

sizeof(bool) n'est pas obligé d'être 1.

GManNickG
la source
y a-t-il un indicateur avec lequel j'ai besoin de compiler mon programme, pour lequel mon compilateur n'utilisera qu'un octet bool?
Eagle
3
@Eagle: Cela dépend de votre compilateur, je ne suis pas sûr. Il est probablement préférable de laisser le soin à votre compilateur.
GManNickG
5
notez que std :: vector <bool> est optimisé pour un vecteur contenant des booléens 1bit par la norme.
user3063349
15

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

«Dans Visual C ++ 4.2, les fichiers d'en-tête C ++ standard contenaient un typedef qui assimilait bool à int. Dans Visual C ++ 5.0 et versions ultérieures, bool est implémenté en tant que type intégré avec une taille de 1 octet. Cela signifie que pour Visual C ++ 4.2, un appel de sizeof (bool) donne 4, tandis que dans Visual C ++ 5.0 et versions ultérieures, le même appel donne 1. Cela peut provoquer des problèmes de corruption de la mémoire si vous avez défini des membres de structure de type bool dans Visual C ++ 4.2 et que vous mélangez des objets (OBJ) et / ou DLL créés avec les compilateurs 4.2 et 5.0 ou version ultérieure. "

Yi Ling
la source
2
Vous réalisez que cela est en quelque sorte lié à la question, mais clairement pas une réponse, puisque 0xbadf00d a posé des questions sur la norme, pas sur une implémentation de compilateur spécifique / choisie arbitrairement, non?
Christopher Creutzig
13
@ChristopherCreutzig C'est une preuve par contre-exemple.
kinokijuf
12
@kinokijuf Ce n'est pas un contre-exemple. Il existe de nombreux éléments dans Visual C ++ qui ne sont pas conformes aux normes.
0xbadf00d
11

C'est la mise en œuvre définie. Ce sizeof(char)n'est que 1par la norme.

peoro
la source
2
Veuillez noter que le 1 dans la norme peut signifier 4 octets. Que chaque type est un produit de 4. Veillez donc à ce que la norme définisse UNIQUEMENT char est le 1, mais ne définit pas la mesure.
user3063349
1 signifie 8 bits ou 1 octet dans la norme
paulm
11
1 octet. Le nombre de bits par octet n'est pas défini par la norme (il doit être d'au moins 8 IIRC), mais peut être trouvé dans CHAR_BIT, défini dans climits.
peoro
3

Voir 5.3.3 paragraphe 1:

[Remarque: en particulier, sizeof (bool) et sizeof (wchar_t) sont définis par l'implémentation.69)]

BЈовић
la source