Pourquoi la sizeof(bool) n'est-elle pas définie comme une, par la norme elle-même?
Taille de char
, signed char
et unsigned char
est défini à 1 octet, par la Norme C++. Je me demande pourquoi il n'a pas défini le sizeof(bool)
aussi?
C++03 Standard de $5.3.3/1 dit,
size of (char), size of(signed char) and sizeof(unsigned char) sont 1; la résultat de sizeof appliqué à toute autre le type fondamental (3.9.1) est la mise en œuvre définies. [Note: in en particulier,sizeof(bool) et sizeof(wchar_t) sont mise en œuvre-défini .69)
je comprends la logique qui sizeof(bool) ne peut pas être inférieur à un octet . Mais y a-t-il une raison pour laquelle elle devrait être supérieure à 1 octet? Je ne dis pas que les implémentations le définissent comme étant supérieur à 1, mais la norme l'a laissé être défini par l'implémentation comme s'il pouvait être supérieur à 1.
S'il n'y a pas de raison pour que sizeof(bool)
soit supérieur à 1, Alors je ne comprends pas pourquoi la norme ne l'a pas défini comme juste 1 byte
, comme il a défini sizeof(char)
, et c'est toutes les variantes.
4 réponses
de nombreuses plates-formes ne peuvent pas charger efficacement des valeurs inférieures à 32 bits. Ils doivent charger 32 bits, et utiliser une opération de déplacement et de masque pour extraire 8 bits. Vous ne voudriez pas cela pour le single bool
s, mais C'est OK pour les cordes.
l'autre taille probable pour elle est celle de int
, étant le type" efficace " entier pour la plate-forme.
sur les architectures où cela fait une différence que l'implémentation choisisse 1 ou sizeof(int)
il pourrait y avoir un compromis entre la taille (mais si vous êtes heureux de gaspiller 7 bits par bool
, pourquoi ne pas être heureux de gaspiller 31 bits? Utilisez bitfields lorsque la taille compte) vs. performance (mais quand stocke et charge des valeurs bool va être un un vrai problème de performance? Utilisez int
explicitement lorsque la vitesse est importante). Donc la flexibilité de mise en œuvre gagne - si pour une raison quelconque 1
serait atroce en termes de performance ou de taille de code, il peut l'éviter.
comme @MSalters l'a souligné, certaines plateformes fonctionnent plus efficacement avec des données plus importantes.
beaucoup de CPU "RISC" (par exemple MIPS, PowerPC, les premières versions de L'Alpha) ont/ont eu beaucoup plus de difficultés à travailler avec des données plus petites qu'un mot, donc ils font la même chose. IIRC, avec au moins quelques compilateurs sur L'Alpha a bool occupé en fait 64 bits.
gcc pour PowerPC Macs par défaut à l'aide de 4 octets pour un bool, mais avait un commutateur pour changer que de un octet, si vous vouliez.
même pour le x86, il y a un avantage à utiliser un élément de données 32 bits. gcc pour le x86 A (ou du moins avait l'habitude d'avoir -- je n'ai pas regardé récemment du tout) une définition dans un de ses fichiers de configuration pour BOOL_TYPE_SIZE
(allant de la mémoire, donc je pourrais avoir ce nom un peu mal) que vous pourriez mettre à 1 ou 4, et puis recompiler le compilateur pour obtenir un bool de cette taille.
Edit: comme pour la raison derrière cela, je disons que c'est un simple reflet d'une philosophie de base de C et C++: laisser autant de place à l'implémentation pour optimiser/personnaliser son comportement comme raisonnable. Exiger un comportement spécifique seulement quand / s'il y a un avantage tangible évident, et peu probable qu'il y ait une responsabilité majeure, surtout si le changement rendrait beaucoup plus difficile de supporter C++ sur une plate-forme particulière (bien que, bien sûr, si la plate-forme est suffisamment obscure, elle pourrait être ignorée).
l'opération résultée en 'sizeof' est MADUs (unité minimale adressable), pas bytes. Donc les processeurs familiaux C54 *. C55 * Texas Instruments, l'expression 1 MADU = 2 octets.
pour cette plateforme sizeof (bool) = sizeof (char) = 1 MADUs = 2 octets. Cela ne viole pas la norme C++, mais clarifie la situation.