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

En C ++, je me demande pourquoi le type bool est long 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 performance, mais alors sur une machine 32 bits ou 64 bits, où les registres ont une largeur de 32 ou 64 bits, quel est l’avantage de performance?

Ou est-ce juste une de ces raisons «historiques»?

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

Comment créez-vous un pointeur sur un seul bit? Vous ne pouvez pas Mais vous pouvez créer un pointeur sur un octet. Donc, un booléen en C ++ est généralement de taille octet. (Il peut être plus grand aussi. Cela dépend de l’implémentation. L’essentiel est qu’il soit adressable, donc aucun type de données C ++ ne peut être plus petit qu’un octet)

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

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

L’access à la mémoire est toujours en “morceaux” (multiple de mots, c’est pour l’ efficacité au niveau matériel , transactions de bus): un bit booléen ne peut pas être adressé “seul” dans la plupart des systèmes CPU. Bien entendu, une fois que les données sont contenues dans un registre , il existe souvent des instructions spécialisées pour manipuler les bits de manière indépendante.

Pour cette raison, il est assez courant d’utiliser des techniques de “mise en paquet” afin d’accroître l’efficacité de l’utilisation de types de données de base “booléens”. Une technique telle que enum (en C) avec un pouvoir de codage 2 est un bon exemple. Le même genre de truc se trouve dans la plupart des langues.

Mis à jour : Grâce à une excellente discussion, il a été porté à mon attention que sizeof(char)==1 par 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 point).

Les réponses concernant 8 bits étant la plus petite quantité de mémoire adressable sont correctes. Cependant, certaines langues peuvent utiliser 1 bit pour les booléens. Je semble me souvenir de Pascal qui implémente 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 gardez une trace de beaucoup de booléens, cela pourrait avoir du sens, mais cela dépend vraiment de la situation.)

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

Je sais que c’est vieux mais je pensais jeter mes 2 centimes.

Si vous limitez votre valeur booléenne ou votre type de données à un bit, votre application risque de subir des problèmes de mémoire. Comment gérez-vous les statistiques d’erreur dans la mémoire qui n’est qu’un bit long?

Je suis allé à une entrevue d’emploi et l’une des déclarations que le responsable du programme m’a dit était: «Lorsque nous envoyons le signal pour lancer un missile, nous envoyons simplement un bit sur le bit via la transmission sans fil. besoin de ce signal pour être aussi rapide que possible. ”

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