Pourquoi un booléen de 1 octet et pas un bit de taille?

En C ++,

  • Pourquoi un booléen de 1 octet et pas un bit de taille?
  • Pourquoi n’y a-t-il pas des types comme des entiers de 4 ou 2 bits?

Je manque les choses ci-dessus lors de l’écriture d’un émulateur pour un processeur

Parce que le processeur ne peut pas adresser quelque chose de plus petit qu’un octet.

De Wikipedia :

Historiquement, un octet était le nombre de bits utilisés pour encoder un seul caractère de texte dans un ordinateur et c’est pour cette raison l’élément élémentaire de base de nombreuses architectures informatiques.

Donc, l’octet est l’ unité adressable de base , en dessous de laquelle l’architecture informatique ne peut pas répondre. Et comme il n’existe probablement pas (probablement) d’ordinateurs prenant en charge l’octet 4 bits, vous n’avez pas de bool 4 bits, etc.

Cependant, si vous parvenez à concevoir une telle architecture capable de s’adresser à une unité adressable de base de 4 bits, vous aurez alors une taille de 4 bits sur cet ordinateur uniquement!

La réponse la plus simple est: c’est parce que le processeur adresse la mémoire en octets et non en bits, et que les opérations au niveau du bit sont très lentes.

Cependant, il est possible d’utiliser une allocation de taille de bit en C ++. Il existe une spécialisation std :: vector pour les vecteurs de bits, ainsi que des structures prenant des entrées de taille binary.

Autrefois, alors que je devais marcher jusqu’à l’école dans une tempête de neige, monter dans les deux sens et que le déjeuner était un animal que nous pouvions traquer dans les bois derrière l’école et tuer à mains nues, les ordinateurs avaient beaucoup moins de mémoire que aujourd’hui. Le premier ordinateur que j’ai jamais utilisé avait 6K de RAM. Pas 6 mégaoctets, pas 6 gigaoctets, 6 kilo-octets. Dans cet environnement, il était logique de mettre autant de booléens dans un int que possible, et nous utilisions donc régulièrement les opérations pour les sortir et les insérer.

Aujourd’hui, quand les gens se moquent de vous avec seulement 1 Go de RAM, et que le seul endroit où vous pouvez trouver un disque dur de moins de 200 Go se trouve dans un magasin d’antiquités, cela ne vaut tout simplement pas la peine d’emballer des bits.

Vous pourriez avoir des bools 1 bit et 4 ints et 2 bits. Mais cela rendrait un jeu d’instructions étrange sans gain de performance, car c’est une manière peu naturelle de regarder l’architecture. Il est en effet logique de “gaspiller” une meilleure partie d’un octet plutôt que d’essayer de récupérer ces données inutilisées.

Selon mon expérience, la seule application qui dérange plusieurs paquets dans un seul octet est Sql Server.

Vous pouvez utiliser des champs de bits pour obtenir des entiers de taille inférieure.

 struct X { int val:4; // 4 bit int. }; 

Bien qu’il soit généralement utilisé pour mapper des structures sur des modèles de bits matériels attendus:

 struct SomThing // 1 byte value (on a system where 8 bits is a byte { int p1:4; // 4 bit field int p2:3; // 3 bit field int p3:1; // 1 bit }; 

Parce qu’un octet est la plus petite unité adressable dans la langue.

Mais vous pouvez faire en sorte que bool prenne 1 bit par exemple si vous en avez plusieurs, par exemple. dans une structure, comme ceci:

 struct A { bool a:1, b:1, c:1, d:1, e:1; }; 

Comme le processeur alloue généralement la mémoire avec 1 octet comme unité de base, bien que certains CPU comme MIPS utilisent un mot de 4 octets.

Cependant, les transactions vector de manière particulière, avec un vector un bit pour chaque bool est atsortingbué.

bool peut être un octet – la plus petite taille adressable de CPU, ou peut être plus grande. Il n’est pas inhabituel que bool soit la taille de int à des fins de performances. Si à des fins spécifiques (par exemple, simulation matérielle) vous avez besoin d’un type avec N bits, vous pouvez trouver une bibliothèque pour cela (par exemple, la bibliothèque GBL a la BitSet ). Si vous êtes concerné par la taille de bool (vous avez probablement un gros conteneur), alors vous pouvez emballer vous-même des bits, ou utiliser std::vector qui le fera pour vous (soyez prudent avec ce dernier, car il ne le fait pas) t satisfaire les exigences du conteneur).

Même si la taille minimale possible est de 1 octet, vous pouvez avoir 8 bits d’informations booléennes sur 1 octet:

http://en.wikipedia.org/wiki/Bit_array

Le langage Julia a BitArray par exemple et j’ai lu sur les implémentations C ++.

Un booléen serait un bit si votre processeur était un processeur 1 bit.

En général, la taille binary d’un processeur (par exemple 8 bits, 16 bits, 32 bits, etc.) est la mesure de la plus petite taille de données pouvant être manipulée par l’unité centrale. (Puisque les pointeurs et les données sont à plusieurs niveaux, la même chose).

L’octet est la plus petite unité de stockage de données numériques d’un ordinateur. Dans un ordinateur, la mémoire vive a des millions d’octets et chacun d’entre eux a une adresse. Si elle avait une adresse pour chaque bit, un ordinateur pourrait gérer 8 fois moins de RAM que possible.

Plus d’infos: Wikipedia

Pensez à la manière dont vous l’implémenteriez au niveau de votre émulateur …

 bool a[10] = {false}; bool &rbool = a[3]; bool *pbool = a + 3; assert(pbool == &rbool); rbool = true; assert(*pbool); *pbool = false; assert(!rbool);