En C ++, je me demande pourquoi le type booléen 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 alors sur une machine 32 bits ou 64 bits, où les registres ont une largeur de 32 ou 64 bits, quel est l'avantage des performances?
Ou est-ce juste une de ces raisons «historiques»?
sizeof(bool)
serait 4. Je pourrais jurer que msvc avait des booléens 32 bits, mais j'ai juste essayé et ce n'est pas le cas.vector<bool>
n'est pas qu'il essaie d'être intelligent et de regrouper les booléens en bits, mais qu'il essaie de le faire et de se déguiser en conteneur STL . Un ensemble de bits simple aurait été bien tant qu'il ne prétend pas être un conteneur STL.bool
type de données C ++ avec leBOOL
type Windows qui est typé àlong
. Doncsizeof(bool) != sizeof(BOOL)
, ce qui, j'en suis sûr, cause beaucoup de confusion (et probablement pas mal de bugs). En particulier , car il y a aussiboolean
etBOOLEAN
typedefs dans Windows, qui sont des alias pourunsigned char
. Notez également que s'il est courantbool
d'être 1 octet, le standard C ++ a une note qui indique spécifiquement que celasizeof(bool)
peut être plus grand.Réponses:
Parce que chaque type de données C ++ doit être adressable.
Comment créeriez-vous un pointeur vers un seul bit? Vous ne pouvez pas. Mais vous pouvez créer un pointeur vers un octet. Ainsi, un booléen en C ++ est généralement de la taille d'un octet. (Il peut également être plus grand. 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 source
La mémoire est adressable par octets. 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.
la source
Un
boolean
type 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'accès à la mémoire se fait toujours par "chunks" (multiple de mots, c'est pour l' efficacité au niveau matériel , transactions sur 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 indépendamment.
Pour cette raison, il est assez courant d'utiliser des techniques de "bit packing" afin d'augmenter l'efficacité de l'utilisation de types de données de base "booléens". Une technique telle que
enum
(en C) avec une puissance de codage 2 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 n'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).la source
bool
ayez omis la partie la plus importante de la réponse: un type suit la plus petite unité de mémoire allouable car C ++ nécessite qu'il soit possible de créer des pointeurs vers lui . Sans cette exigence, abool
aurait pu être représenté sous la forme d'un seul bit, même sur les machines adressables par octets actuelles.sizeof(char)==1 definition
c'est le meilleur contre-argument à mon argumentation. Merci!Les réponses sur 8 bits étant la plus petite quantité de mémoire adressable sont correctes. Cependant, certains langages peuvent utiliser 1 bit pour les booléens, d'une certaine manière. Il me semble me souvenir que Pascal implémentait des ensembles sous forme de chaînes de bits. Autrement dit, pour l'ensemble suivant:
Vous pourriez avoir ceci en mémoire:
Vous pouvez, bien sûr, faire quelque chose de similaire en C / C ++ si vous le souhaitez. (Si vous suivez un tas de booléens, cela peut avoir du sens, mais cela dépend vraiment de la situation.)
la source
vector
. Ce n'est pas en fait un conteneur de type STL, car il y a des contraintes sur le comportement. Ce qui est pire, c'est que cela cause des problèmes à quelqu'un qui a desbool
s et qui veut en faire unvector
. C'est un comportement surprenant, et ce n'est pas ce que vous voulez dans une langue.Je sais que c'est vieux mais je pensais que je mettrais mes 2 cents.
Si vous limitez votre booléen ou votre type de données à un bit, votre application court un risque de curruption de mémoire. Comment gérez-vous les statistiques d'erreur dans la mémoire qui ne fait qu'un bit?
Je suis allé à un entretien d'embauche et l'une des déclarations que m'a dit le responsable du programme était: «Lorsque nous envoyons le signal pour lancer un missile, nous envoyons simplement un bit on off via sans fil. L'envoi d'un bit est extrêmement rapide et nous ont besoin que ce signal soit 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. Comment serait-il facile pour un méchant d'envoyer un message d'un bit. Ou que se passe-t-il si, lors de la transmission, le bit est inversé.
la source
bool
utilise 8 bits sur la machine d'OP et 32 sur la mienne, car ces 7 ou 31 bits ne sont certainement pas utilisés pour des "statistiques d'erreur". Cela n'a aucun sensCertains compilateurs embarqués ont un type int1 qui est utilisé pour regrouper les bits des indicateurs booléens (par exemple la série CCS de compilateurs C pour les MPU Microchip). La définition, l'effacement et le test de ces variables utilisent des instructions au niveau du bit à instruction unique, mais le compilateur ne permettra aucune autre opération (par exemple en prenant l'adresse de la variable), pour les raisons indiquées dans d'autres réponses.
la source