152 votes

C++ : pourquoi bool est de 8 bits?

En C++, je me demandais pourquoi le type bool est de 8 bits (sur mon système), où un seul bit est assez pour tenir la valeur booléenne ?

Je croyais que c'était pour des raisons de performances, mais alors sur un 32 bits ou 64 bits de la machine, où les registres de 32 bits ou 64 bits de large, ce qui est l'avantage de performance ?

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

239voto

jalf Points 142628

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

Comment voulez-vous créer 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 d'octets de taille. (Il peut être plus grand. Jusqu'à la mise en œuvre. La chose principale est qu'il doit être adressable, donc pas de C++ type de données peut être plus petit qu'un octet)

40voto

Stephen Roantree Points 361

La mémoire est l'octet adressable. Vous ne pouvez pas répondre à un seul bit, sans se déplacer ou de masquage de l'octet lu à partir de la mémoire. J'imagine que c'est une très grande raison.

25voto

jldupont Points 31331

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

L'accès à la mémoire est toujours en "morceaux" (multiple de mots, c'est pour l'efficacité au niveau du matériel, bus transactions): booléenne bits ne peuvent pas être traitées "seul" dans la plupart des systèmes à UC. Bien sûr, une fois que les données sont contenues dans un registre, il y a souvent des instructions spéciales pour manipuler des bits de façon indépendante.

Pour cette raison, il est très fréquent d'utiliser des techniques de "bits d'emballage" dans le but d'accroître l'efficacité dans l'utilisation de "boolean" types de données de base. Une technique comme enum (en C) avec une puissance de 2 codage est un bon exemple. Le même genre de truc est trouvé dans la plupart des langues.

Mise à jour: Grâce à une excellente discussion, il a été porté à mon attention qu' sizeof(char)==1 par définition en C++. Par conséquent, l'adressage d'un "boolean" type de données est assez liée à la plus petite unité de mémoire adressable (renforce mon point de vue).

6voto

Benjamin Oakes Points 3715

Les réponses sur 8 bits étant la plus petite quantité de mémoire adressable sont corrects. Cependant, certaines langues peuvent utiliser 1 bit pour les booléens, d'une certaine manière. Je crois me souvenir de Pascal la mise en œuvre des ensembles comme des chaînes de bits. C'est, 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 êtes de garder la trace d'un tas de booléens, il pourrait faire sens, mais cela dépend vraiment de la situation.)

2voto

Cire Points 1

Je sais que c'est vieux, mais j'ai pensé que je jetterais dans mes 2 cents.

Si vous limitez votre booléen ou un type de données pour un peu, alors votre demande est à risque pour la mémoire de la corruption. Comment gérez-vous d'erreur statistiques de la mémoire qui n'est qu'un peu long?

Je suis allé à une entrevue d'emploi et l'une des déclarations de la chef de programme, m'a dit était, "Quand nous envoyer le signal pour lancer un missiles nous suffit d'envoyer un simple bit d'arrêt bit via wi-fi. L'envoi d'un bit est généralement rapide et nous avons besoin d'un signal pour être aussi rapide que possible."

Eh bien, c'était un test pour voir si j'ai bien compris les concepts et les bits, octets, et la gestion des erreurs. Comment serait-il facile pour un bad guy de l'envoyer un peu de msg. Ou ce qui se passe si, au cours de transmittion le bit se retourné dans l'autre sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X