3 votes

C++ : La variable bool est-elle une variable à 1 bit ?

Je me demandais si les bools en C++ sont en fait des variables de 1 bit. Je travaille sur un PMM pour mon noyau et l'utilisation de tableaux de bools (peut-être multidimensionnels) serait très agréable. Mais je ne veux pas gaspiller de l'espace si un bool en C++ a une longueur de 8 bits...

EDIT : Un bool[8] est-il alors long d'un octet ? Ou 8 octets ? Est-ce que je pourrais déclarer quelque chose comme bool bByte[8] __attribute__((packed)); lors de l'utilisation de gcc ? Et comme je l'ai dit : Je suis en train de coder un noyau. Je ne peux donc pas inclure les bibliothèques standard.

4voto

πάντα ῥεῖ Points 15683

Non, il n'existe pas de variable à 1 bit.

La plus petite unité que l'on puisse traiter en c++ est un unsigned char .

Un bool[8] a-t-il une longueur de 1 octet ?

Non.

Ou 8 octets ?

Pas nécessairement. Cela dépend du nombre de bits pris par la machine cible pour un unsigned char .


Mais je ne veux pas gaspiller de l'espace si un bool en C++ a une longueur de 8 bits...

Vous pouvez éviter de gaspiller de l'espace lorsque vous traitez des bits en utilisant std::bitset ou boost::dynamic_bitset si vous avez besoin d'une taille dynamique.


Comme l'a souligné @zett42 dans son commentaire il est également possible d'adresser des bits individuels avec une structure bitfield (mais pour des raisons d'alignement de la mémoire cache, cela nécessitera probablement encore plus d'espace) :

struct S {
    // will usually occupy 4 bytes:
    unsigned b1 : 1, 
             b2 : 1,
             b3 : 1;
};

1voto

Jerry Coffin Points 237758

A bool utilise au moins un octet (et peut-être plus) de stockage, donc oui, au moins 8 bits.

A vector<bool> Cependant, il stocke normalement un bool en un seul bit, avec quelques astuces sous forme d'itérateurs proxy et autres pour imiter (en grande partie) l'accès à de véritables bool même si ce n'est pas ce qu'ils stockent. La norme C++ originale requis ce. Les plus récents ont assoupli les exigences afin de permettre à une entreprise d'avoir accès à des informations sur ses activités. vector<bool> de ce que l'on attendrait normalement (c'est-à-dire un ensemble de bool objets). Cependant, malgré les exigences assouplies, un bon nombre d'implémentations continuent à les stocker sous forme condensée dans un fichier vector<bool> .

Notez cependant qu'il n'en va pas de même pour les autres types de conteneurs - par exemple, un conteneur list<bool> ou deque<bool> ne peut pas utiliser une représentation par paquets de bits.

Notez également qu'en raison de l'exigence d'un itérateur de proxy (et autres), un vector<bool> qui utilise une représentation bit-packed pour le stockage ne peut pas répondre aux exigences imposées aux conteneurs normaux, vous devez donc être prudent dans ce que vous attendez d'eux.

-2voto

ephemient Points 87003

La plus petite unité de mémoire adressable est un char . A bool[N] ou std::array<bool, N> utilisera autant d'espace qu'un char[N] ou std::array<char, N> .

La norme autorise (mais n'impose pas) que les implémentations de std::vector<bool> peut être spécialisée dans l'emballage de morceaux.

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