Pourquoi un char et un bool ont-ils la même taille en C++?
Je lis le langage de programmation C++. dans ce Stroustrup indique que sizeof(char) == 1
et 1 <= sizeof(bool)
. Les spécificités dépendent de la mise en œuvre. Pourquoi une valeur aussi simple qu'un booléen prendrait-elle le même espace qu'un char?
7 réponses
Dans les architectures informatiques modernes, un octet est la plus petite unité de mémoire adressable. Pour emballer plusieurs bits dans un octet, il faut appliquer des opérations de décalage de bits supplémentaires. Au niveau du compilateur, c'est un compromis entre les exigences de mémoire et de vitesse (et dans les logiciels haute performance, Ces opérations de décalage de bits supplémentaires peuvent s'additionner et ralentir inutilement l'application).
Parce qu'en C++ vous pouvez prendre l'adresse d'un booléen et la plupart des machines ne peuvent pas adresser des bits individuels.
Il prend le même espace, car la plus petite quantité d'espace que vous pouvez écrire en mémoire est un seul octet. Les deux valeurs sont stockées dans un octet. Bien que vous n'ayez théoriquement besoin que de 1 bit pour signifier une valeur booléenne, vous devez toujours avoir un Octet entier pour stocker la valeur.
Théoriquement, vous n'avez besoin que d'un seul bit pour un bool, mais travailler avec moins de 1 octet de données est désordonné. Vous avez besoin de plus d'instructions pour réaliser quoi que ce soit et vous n'en bénéficiez pas vraiment.
Si vous voulez mettre plusieurs booléens en un seul octet, vous pouvez utiliser un bits structure.
En fait, dans la plupart des implémentations que je connais sizeof (bool) == sizeof (int). "int" est destiné à être la taille de données la plus efficace pour le CPU. Par conséquent, les choses qui n'ont pas de taille spécifique (comme "char") ont la même taille qu'un int. Si vous en aviez un grand nombre par objet, vous pouvez implémenter un moyen de les emballer pour le stockage, mais pendant le calcul normal, il devrait être laissé sa taille native.
Il y a cette chose en C++ appelée vector qui tente d'exploiter le fait que vous pouvez théoriquement stocker 8 bools dans un char, mais c'est largement considéré comme une erreur par le Comité des normes C++. Le livre "effective stl" dit en fait "ne l'utilisez pas". Cela devrait vous donner une idée de la façon dont il est difficile.
BTW: Knuth a un livre juste dédié aux opérations binaires. Boost dispose également d'une bibliothèque dédiée à la gestion d'un grand nombre de bits dans une mémoire supplémentaire de manière efficace.
Un octet est la plus petite unité adressable de mémoire.
Considérons le code suivant:
bool b[9];
bool *pb0 = &b[0];
bool *pb1 = &b[1];
for (int counter=0; counter<9; ++counter)
{
// some code here to fill b with values
b[counter] = true;
}
Si bool est stocké comme 1 bit, alors pb0 sera égal à pb1, car les deux ont la même adresse. Ce n'est clairement pas souhaitable!
En outre, l'affectation dans la boucle entraînera un code d'assemblage non trival. Cela impliquera un décalage de bits différent à chaque itération de la boucle. En haute-logiciel de performances, cette opération peut ralentir l'application inutilement.
La bibliothèque STL fournit une solution de contournement dans les situations où l'espace est important. L'utilisation de std::vector
- , la surcharge de l'opérateur[] masque les rigueurs de l'opération de décalage de bits
- l'utilisation d'itérateurs au lieu de pointeurs donne une flexibilité supplémentaire à l'implémentation