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?

30
demandé sur Sebastian Mach 2008-11-06 00:54:31

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).

65
répondu Cybis 2008-11-05 22:00:12

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.

19
répondu Robert Gamble 2008-11-05 22:15:57

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.

11
répondu Kibbee 2008-11-05 21:56:20

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.

4
répondu Rob Walker 2008-11-05 21:56:45

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.

2
répondu James Curran 2008-11-05 22:04:01

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.

2
répondu David Nehme 2008-11-05 22:09:03

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 va stocker bool 1 bits. Le paradoxe de l'exemple ci-dessus ne s'applique pas car

  • , 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
2
répondu sep 2008-11-06 11:23:41