Pourquoi une valeur booléenne est-elle stockée sous forme d'octet à l'intérieur d'un ordinateur alors qu'elle ne nécessite qu'un bit

32

J'ai récemment commencé à apprendre à écrire du code, et dans mon livre, je suis tombé sur cette question. "Pourquoi une valeur booléenne est-elle stockée sous forme d'octet à l'intérieur d'un ordinateur alors qu'elle ne nécessite qu'un bit?" quelqu'un peut-il éclairer davantage cette question?

Mr. 1.0
la source
10
Ce n'est pas à vrai dire vrai. Certains langages (comme C / C ++) offrent des moyens de stocker des valeurs booléennes sous forme de bits uniques, si ces bits sont regroupés dans un seul octet. En d'autres termes, en C, vous pouvez stocker huit booléens dans un octet. Mais rares sont ceux qui l'utilisent car la mémoire est bon marché et les processeurs manipulent les données en morceaux de 8/16/32/64 bits.
Gort the Robot
Cette réponse à une question similaire est ce que vous devriez voir! Vous obtiendrez une énorme référence là-bas ... A bientôt!
Sam
2
Duplicate de stackoverflow.com/questions/14220726/one-byte-bool-why
Arrêtez de nuire à Monica le
Étroitement liés: stackoverflow.com/questions/8014161/…
Ben Lee

Réponses:

49

Cela a à voir avec ce que le processeur peut facilement traiter. Par exemple, sur un processeur x86, il existe un eax(32 bits), ax(16 bits) et un ah(8 bits) mais pas de registre à bit unique. Donc, pour qu'il utilise un seul bit, le CPU devra faire une lecture / modification / écriture pour changer la valeur. S'il est stocké sous forme d'octet, une seule lecture ou écriture peut être utilisée pour inspecter / modifier la valeur.

De plus, on peut se demander s'il serait préférable d'utiliser un seul bit par rapport à un octet complet, après tout, un octet gaspillera 7 bits. À moins que l'espace ne soit une contrainte, il faut choisir l'octet car, au moins le x86 et je pense que d'autres, il y a généralement des instructions pour définir / effacer rapidement un booléen qui est beaucoup plus rapide que la lecture / modification / écriture d'un seul bit . D'après des mesures personnelles, j'ai vu la méthode de lecture / mod / écriture 5 fois plus lente que la méthode à instruction unique.

barrem23
la source
6
Le seul mot qui vous manque est "Alignement des limites".
Manoj R
3
D'un autre côté, j'ai vu une accélération 2x de l'utilisation de bits individuels, probablement en raison d'une meilleure utilisation du cache avec un ensemble de données plus petit.
Michael Borgwardt
5

Comme l'explique @ barrem23 , les données doivent être adressables , et la plus petite frontière sur les architectures conventionnelles est un octet.

Mais puisque cette question est étiquetée comme , il peut être utile de souligner qu'elle std::vector<bool>est spécialisée pour permettre aux éléments individuels d'être stockés sous forme de bits . Cela économisera de l'espace en sacrifiant certaines fonctionnalités (par exemple, std::searchpeut ne pas fonctionner).

chrisaycock
la source