Pourquoi la sizeof(bool) n'est pas défini pour l'être, par la Norme elle-même?
Taille de char
, signed char
et unsigned char
est définie à 1 octet, par la Norme C++ lui-même. Je me demande pourquoi il n'a pas de définir la sizeof(bool)
aussi?
C++03 Standard de $5.3.3/1 dit,
sizeof(char), sizeof(char signé) et
sizeof(unsigned char) sont 1; la
résultat de sizeof appliquée à tout autre
type fondamental (3.9.1) est
la mise en œuvre définies. [Note: dans
en particulier,sizeof(bool) et
sizeof(wchar_t) sont
la mise en œuvre définies par.69)
Je comprends la logique qui sizeof(bool) ne peut être inférieur à un octet. Mais est-il une raison pour laquelle il devrait être plus grand que 1 octet soit? Je ne dis pas que les implémentations de la définir à être plus grand que 1, mais la Norme de gauche à être défini par la mise en œuvre comme si elle peut être supérieur à 1.
Si il n'y a pas de raison sizeof(bool)
à être plus grand que 1, je ne comprends pas pourquoi le Standard n'a pas de définir simplement comme 1 byte
, comme il l'a défini sizeof(char)
, et c'est toutes les variantes.
sizeof(char)
est spécifié pour l'être, mais est-il indiqué pour être un seul octet ? Je ne pense pas que la taille exacte est précisé, dans le cas d'une architecture qui vient de sortir qui stocke les bits à 16 au lieu de 8.- octet" est également défini de façon à être le même que pour un char ;-). Si une architecture magasins de bits à 16, puis il y a 16 bits dans un octet dans la mesure du C++ est concernée sur cette plate-forme. Toute croyance que vous pourriez avoir et qui "octet" signifie "octet" doit être laissé à la porte...
- le unité de sizeof est un octet. Mais octet n'est pas nécessairement en 8 bits!
- Ah merci, ne me souviens pas de la distinction 🙂
CHAR_BIT
, défini dans<cstddef>
ou<stddef.h>
, spécifie le nombre de bits dans un octet.- Double Possible de Pourquoi un char et un bool de la même taille en c++?
Vous devez vous connecter pour publier un commentaire.
De nombreuses plates-formes ne peuvent pas efficacement les valeurs de charge inférieur à 32 bits. Ils ont à charge 32 bits, et l'utilisation d'un shift-and-masque de fonctionnement de l'extrait de 8 bits. Vous ne voulez pas de cette unique
bool
s, mais c'est OK pour les chaînes.sizeof(bool)
plus grand que 1?STRB
(Magasin Octet) de l'instruction qui est drôle. "AMPB répète le bas à 8 bits de la source d'inscrire quatre fois à travers le bus de données. La mémoire externe du système doit activer la appropriée de l'octet de sous-système pour stocker les données."L'autre taille probable est que de
int
, être "efficace" de type entier pour la plate-forme.Sur les architectures où cela fait une différence si la mise en œuvre choisit 1 ou
sizeof(int)
il pourrait y avoir un compromis entre la taille (mais si vous êtes heureux de déchets de 7 bits parbool
, pourquoi ne devriez-vous pas être heureux de déchets 31? Utilisation bitfields lorsque les sujets de taille) et de performances (mais quand c'est le stockage et le chargement des valeurs bool va être un véritable problème de performance? Utilisationint
explicitement lorsque la vitesse de questions). Donc, la mise en œuvre de la flexibilité gagne - si, pour quelque raison1
serait atroce en termes de performances ou de la taille du code, il peut l'éviter.Comme @MSalters souligné, certaines plates-formes de travail de manière plus efficace avec de plus grands éléments de données.
De nombreux "RISC" Cpu (par exemple, MIPS, PowerPC, les premières versions de l'Alpha) ont/ont eu beaucoup plus de difficulté à travailler avec des données plus petite qu'un mot, si ils font la même chose. IIRC, avec au moins certains compilateurs sur l'Alpha d'un bool réellement occupé 64 bits.
gcc pour les Mac à processeur PowerPC, par défaut, à l'aide de 4 octets pour un bool, mais a un switch pour modifier qu'à un seul octet, si vous vouliez.
Même pour le x86, il y a certains avantages à l'utilisation de données 32 bits élément. gcc pour le x86 a (ou au moins l'habitude d'avoir -- je n'ai pas regardé récemment à tous) une définition dans l'une de ses fichiers de configuration pour
BOOL_TYPE_SIZE
(de mémoire, si je pouvais avoir ce nom un peu mal) que vous pourriez mettre à 1 ou 4, et puis re-compiler le compilateur pour obtenir un booléen de taille.Edit: Comme pour la raison derrière cela, je dirais que c'est un simple reflet d'une philosophie de base de C et C++: laisser le plus de place pour la mise en œuvre pour optimiser/personnaliser son comportement raisonnable. Exiger un comportement spécifique seulement quand/si il y a une évidente, avantages tangibles, et peu de chances d'être toute grande responsabilité, surtout si le changement de la rendre beaucoup plus difficile sur le support C++ sur certaines plate-forme en particulier (même si, bien sûr, si la plate-forme est assez obscure, il peut être ignoré).
bool
pour être compatible avec les opérations atomiques, mais PowerPC requis plus élevé d'alignement. Il n'y a pas de temps à ajouter latypedef
et pas d'autre moyen de définir une interface de frontière entre les différentes définitions debool
. Les plus anciennes de Mac OS (y compris sans doute son port de GCC) a 1 octetbool
, et le commutateur probablement la compatibilité d'un tel code, au détriment de ne plus être en mesure d'utiliser beaucoup de BSD, les appels système. Les programmeurs avaient alors à se sevrer de l'interrupteur par la définition de leurs propresbool
.L'opération a abouti à 'sizeof' est MADUs (minime addresible unité), pas d'octets. Donc, la famille de processeurs C54 *. C55 * Texas Instruments, l'expression 1 MADU = 2 octets.
Pour cette plate-forme sizeof (bool) = sizeof (char) = 1 MADUs = 2 octets.
Cela ne viole pas le C + + standard, mais clarifie la situation.
sizeof
est exprimée en octets. Le standard C++ définit le terme "octet" différemment de la façon dont il est couramment utilisé. Si le minimum addressible unité est de 16 bits, puis un octet (tel que défini par C et C++) est de 16 bits pour cette plate-forme.sizeof (char) == 1
par définition; sisizeof (char)
les rendements à 2, votre compilateur est non conforme.sizeof
opérateur donne le nombre d'octets dans la représentation des objets de son opérande."byte
êtresizeof(char)
, et non l'inverse. Si vous êtes seulement une plate-forme oùsizeof(char)
n'est pas de 8 bits, vous aurez un très mauvais temps jusqu'à ce que vous en rendre compte.