web-dev-qa-db-fra.com

C ++: pourquoi bool fait 8 bits de long?

En C++, je me demande pourquoi le type bool a une longueur de 8 bits (sur mon système), où un seul bit suffit pour contenir la valeur booléenne?

J'avais l'habitude de croire que c'était pour des raisons de performances, mais ensuite sur une machine 32 bits ou 64 bits, où les registres ont une largeur de 32 ou 64 bits, quel est l'avantage de la performance?

Ou est-ce juste une de ces raisons "historiques"?

125
Jérôme

Parce que chaque type de données C++ doit être adressable.

Comment créer un pointeur sur un bit? Tu ne peux pas. Mais vous pouvez créer un pointeur sur un octet. Ainsi, un booléen en C++ est généralement de la taille en octets. (Il peut également être plus volumineux. Cela dépend de l'implémentation. L'important est qu'il doit être adressable, donc aucun type de données C++ ne peut être plus petit qu'un octet)

214
jalf

La mémoire est adressable par octet. Vous ne pouvez pas adresser un seul bit sans décaler ou masquer l'octet lu en mémoire. J'imagine que c'est une très grande raison.

38
Stephen Roantree

Un boolean tape normalement suit la plus petite unité de mémoire adressable de la machine cible (c’est-à-dire généralement l’octet de 8 bits).

L'accès à la mémoire se fait toujours par "morceaux" (plusieurs mots, c'est pour efficacité au niveau du matériel, transactions de bus): un bit booléen ne peut pas être adressé "seul" dans la plupart des systèmes à processeur. Bien sûr, une fois que les données sont contenues dans un registre, il existe souvent des instructions spécialisées permettant de manipuler les bits indépendamment.

Pour cette raison, il est assez courant d'utiliser des techniques de "compression de bits" afin d'accroître l'efficacité d'utilisation des types de données de base "booléens". Une technique telle que enum (en C) avec une puissance de 2 codage en est un bon exemple. Le même genre d'astuce se retrouve dans la plupart des langues.

Mise à jour: Grâce à une excellente discussion, il m'a été signalé que sizeof(char)==1 by définition en C++. Par conséquent, l'adressage d'un type de données "booléen" est assez lié à la plus petite unité de mémoire adressable (renforce mon propos).

18
jldupont

Les réponses indiquant que 8 bits sont la plus petite quantité de mémoire adressable sont correctes. Cependant, certaines langues can utilisent 1 bit pour les booléens, en quelque sorte. Il me semble que Pascal ait implémenté des ensembles en tant que chaînes de bits. C'est-à-dire pour l'ensemble suivant:

{1, 2, 5, 7}

Vous pourriez avoir ceci en mémoire:

01100101

Vous pouvez bien sûr faire quelque chose de similaire en C/C++ si vous le souhaitez. (Si vous surveillez un groupe de booléens, cela pourrait est logique, mais cela dépend vraiment de la situation.)

6
Benjamin Oakes

Je sais que c'est vieux, mais j'ai pensé jeter mes 2 centimes.

Si vous limitez votre type de données ou booléen à un bit, votre application risque de perdre de la mémoire. Comment gérez-vous les statistiques d'erreur en mémoire qui ne durent qu'un bit?

Je suis allé à un entretien d'embauche et l'une des affirmations du responsable du programme m'a dit ceci: "Lorsque nous envoyons le signal de lancer un missile, nous envoyons simplement un bit un peu en mode sans fil. L'envoi d'un bit est extrêmement rapide et nous besoin de ce signal pour être aussi rapide que possible ".

Eh bien, c'était un test pour voir si j'avais bien compris les concepts, les bits, les octets et le traitement des erreurs. Comme il serait facile pour un méchant d’envoyer un message un bit. Ou que se passe-t-il si, pendant la transmission, le bit est inversé?.

1
Cire

Certains compilateurs incorporés doivent avoir un type int1 utilisé pour compresser les indicateurs booléens (par exemple, les compilateurs C de la série CCS pour les MPU Microchip). La définition, l'effacement et le test de ces variables utilisent des instructions de niveau bit à une seule instruction, mais le compilateur n'autorise aucune autre opération (par exemple, en prenant l'adresse de la variable), pour les raisons indiquées dans d'autres réponses.

1
EBlake