web-dev-qa-db-fra.com

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

En C++,

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

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

114
Asm

Parce que le processeur ne peut rien traiter de plus petit qu'un octet.

180
Paul Tomblin

De Wikipedia :

Historiquement, un octet était le nombre de bits utilisé pour coder un seul caractère de texte dans un ordinateur. C’est pour cette raison l’élément adressable de base dans de nombreux cas. architectures informatiques.

Donc, octet est le unité adressable de base, en dessous duquel l’architecture de l’ordinateur ne peut pas s’adresser. Et comme il n’existe pas (probablement) d’ordinateurs prenant en charge les octets 4 bits, vous n’avez pas 4 bits bool etc.

Cependant, si vous pouvez concevoir une telle architecture pouvant traiter 4 bits en tant qu'unité adressable de base, vous aurez alors bool de taille 4 bits, uniquement sur cet ordinateur!

27
Nawaz

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

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

12
sukru

À l’époque, quand je devais marcher jusqu’à l’école dans une tempête de neige qui faisait rage, le déjeuner était l’un des animaux que nous pouvions traquer dans les bois derrière l’école et tuer avec nos mains nues, les ordinateurs avaient beaucoup moins de mémoire disponible aujourd'hui. Le premier ordinateur que j'ai utilisé avait 6K de RAM. Pas 6 mégaoctets, pas 6 giga-octets, 6 kilo-octets. Dans cet environnement, il était logique de regrouper autant de booléens dans un int que possible et nous avons donc régulièrement recours à des opérations pour les supprimer et les insérer.

Aujourd'hui, lorsque les gens se moqueront de vous pour n'avoir que 1 Go de RAM et que le seul endroit où vous pourriez trouver un disque dur de moins de 200 Go est dans un magasin d'antiquités, il ne vaut pas la peine d'emballer des bits.

8
Jay

Vous pourriez avoir des bools 1 bit et des ints 4 et 2 bits. Mais cela ferait un ensemble d'instructions bizarres sans gain de performances, car c'est une façon peu naturelle de regarder l'architecture. En réalité, il est logique de "gaspiller" une meilleure partie d'un octet plutôt que d'essayer de récupérer ces données inutilisées.

La seule application qui dérange de mettre plusieurs objets dans un seul octet, d'après mon expérience, est Sql Server.

6
Paul Sasik

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 avec les modèles de bits attendus du matériel exact:

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
};
5
Martin York

Parce qu'un octet est la plus petite unité adressable de la langue.

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

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

En général, le processeur alloue de la mémoire avec 1 octet comme unité de base, même si certains processeurs comme MIPS utilisent un mot de 4 octets.

Cependant vector traite bool d'une manière spéciale, avec vector<bool> un bit pour chaque booléen est alloué.

1
Ryan Li

bool peut être un octet - la plus petite taille de CPU adressable, ou peut être plus grande. Il n'est pas rare que bool soit de la taille de int à des fins de performance. Si, à des fins spécifiques (simulation matérielle par exemple), vous avez besoin d’un type à N bits, vous pouvez trouver une bibliothèque pour ce type (par exemple, la bibliothèque GBL a BitSet<N> classe). Si vous êtes préoccupé par la taille de bool (vous avez probablement un grand conteneur), vous pouvez alors emballer vous-même des bits ou utiliser std::vector<bool> qui le fera pour vous (soyez prudent avec ce dernier, car il ne répond pas aux exigences du conteneur).

1
Gene Bushuyev

Même lorsque 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 utilise BitArray, par exemple, et j'ai lu des informations sur les implémentations C++.

1
Diego Javier Zea

Réfléchissez à la manière dont vous implémenteriez cela 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);
0
franji1

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

En général, la taille en bits d'un processeur (par exemple, 8 bits, 16 bits, 32 bits, etc.) est une mesure de la plus petite taille de données pouvant être manipulée par le processeur - il s'agit donc AUSSI de la taille de l'espace d'adressage. (Puisque les pointeurs et les données sont à plusieurs niveaux la même chose.).

0
Hogan

L'octet est la plus petite unité de stockage de données numériques d'un ordinateur. Dans un ordinateur, la RAM contient des millions d'octets et chacun d'entre eux a une adresse. S'il dispose d'une adresse pour chaque bit, un ordinateur peut gérer 8 fois moins de temps RAM que ce qu'il peut.

Plus d'infos: Wikipedia

0
Francesco Pasa