Question

Je suis en train de lire Le langage de programmation C ++. Dans celui-ci, Stroustrup précise 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 caractère?

Était-ce utile?

La solution

Dans les architectures informatiques modernes, un octet est la plus petite unité de mémoire adressable. Pour compresser plusieurs bits dans un octet, vous devez appliquer des opérations de décalage de bits supplémentaires. Au niveau du compilateur, c’est un compromis entre la mémoire et la vitesse (et dans les logiciels hautes performances, ces opérations de décalage de bits supplémentaires peuvent s’ajouter et ralentir inutilement l’application).

Autres conseils

Parce qu'en C ++, vous pouvez prendre l'adresse d'un booléen et la plupart des machines ne peuvent pas traiter des bits individuels.

Cela 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 d’un bit pour indiquer une valeur booléenne, vous devez toujours disposer d’un octet entier pour stocker la valeur.

Théoriquement, vous n'avez besoin que d'un seul bit pour un booléen, mais travailler avec moins d'un octet de données est compliqué. Vous avez besoin de plus d’instructions pour obtenir quoi que ce soit et vous n’en tirerez aucun avantage.

Si vous souhaitez regrouper plusieurs booléens dans un seul octet, vous pouvez utiliser une structure de champs de bits .

En fait, dans la plupart des implémentations que je connaisse de sizeof (bool) == sizeof (int). " int " est censé être la taille de données la plus efficace pour le processeur. 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 avez un grand nombre par objet, vous pouvez implémenter un moyen de les emballer pour le stockage, mais lors du calcul normal, conservez sa taille native.

Il existe un élément appelé vecteur appelé C ++ qui tente d'exploiter le fait que vous pouvez théoriquement stocker 8 bools dans un caractère, mais il est généralement considéré comme une erreur par le comité de normalisation C ++. Le livre & "; Efficace stl &"; indique en fait & "Ne l'utilisez pas &". Cela devrait vous donner une idée de sa difficulté.

BTW: Knuth a ouvert un livre aux opérations au niveau des bits. Boost a également une bibliothèque dédiée au traitement de grands nombres de bits de manière plus efficace en mémoire.

Un octet est la plus petite unité de mémoire adressable.

Considérez 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é sous 1 bit, alors pb0 sera égal à pb1, car les deux ont la même adresse. Ce n'est clairement pas souhaitable!

De plus, l’affectation dans la boucle donnera un code d’assemblage non trival. Cela impliquera un décalage de bit différent à chaque itération de la boucle. Dans les logiciels hautes performances, ces opérations de décalage de bits supplémentaires peuvent ralentir inutilement l’application.

La bibliothèque STL offre une solution de contournement dans les situations où l’espace est IMPORTANT. L'utilisation de std :: vector & Lt; bool & Gt; va stocker bool comme 1 bit. 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 bit
  • l'utilisation d'itérateurs au lieu de pointeurs donne plus de flexibilité à la mise en oeuvre
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top