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

En C++,

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

je manque les choses ci-dessus en écrivant un émulateur pour un CPU

92
demandé sur Hogan 2011-01-07 18:02:32

13 réponses

parce que le CPU ne peut pas traiter quoi que ce soit de plus petit qu'un octet.

161
répondu Paul Tomblin 2011-01-07 15:03:42

À Partir De Wikipedia :

historiquement, un octet était le nombre de bits utilisés pour coder un caractère unique de texte dans un ordinateur et il est pour cette raison le adressable de base élément dans de nombreux ordinateurs architecture.

donc byte est le unité adressable de base , en dessous de laquelle l'architecture informatique ne peut pas adresse. Et comme il n'existe pas (probablement) d'ordinateurs qui prennent en charge les bytes 4 bits, vous n'avez pas 4 bits bool etc.

cependant, si vous pouvez concevoir une telle architecture qui peut adresser 4-bit comme unité adressable de base, alors vous aurez bool de taille 4-bit alors, sur cet ordinateur seulement!

24
répondu Nawaz 2011-04-03 07:37:32

la réponse la plus simple est que le CPU adresse la mémoire en octets et non en bits, et les opérations en bits sont très lentes.

cependant, il est possible d'utiliser l'allocation de la taille d'un bit en C++. Il y a std::vector specialization pour les vecteurs de bits, et aussi des structures prenant des entrées de taille bit.

12
répondu sukru 2011-01-07 15:04:42

à l'époque où je devais marcher jusqu'à l'école dans un blizzard déchaîné, en montée dans les deux sens, et où 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 disponible qu'aujourd'hui. Le premier ordinateur que j'ai utilisé avait 6K de RAM. Pas 6 mégaoctets, pas 6 gigaoctets, 6 kilooctets. Dans cet environnement, il était très sensé d'embarquer autant de booléens que vous le pouviez, et donc nous utiliserions régulièrement des opérations pour les sortir et les mettre dedans.

Aujourd'hui, quand les gens vont se moquer de vous pour avoir seulement 1 Go de RAM, et le seul endroit où vous pourriez trouver un disque dur avec moins de 200 Go est à un magasin d'antiquités, il est juste pas la peine de la peine de pack bits.

8
répondu Jay 2011-01-07 17:36:07

vous pouvez avoir des bobines 1-bit et 4 et 2-bit. Mais cela ferait un ensemble d'instructions bizarre pour aucun gain de performance parce que c'est une façon anormale de regarder l'architecture. Il fait réellement sens de "déchets", une bonne partie d'un octet plutôt que d'essayer de récupérer les données inutilisées.

D'après mon expérience, la seule application qui dérange le pack de plusieurs bools dans un seul octet est Sql Server.

6
répondu Paul Sasik 2011-01-07 15:40:38

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 habituellement utilisé pour cartographier les structures à des configurations de bits attendues 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
répondu Martin York 2011-01-07 15:15:24

parce qu'un octet est la plus petite unité possible dans la langue.

Mais vous pouvez faire bool prendre 1 bit par exemple, si vous avez un tas d'entre eux par exemple. dans une structure, comme ceci:

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};
4
répondu bratao 2011-01-08 20:57:28

parce que le CPU attribue généralement la mémoire avec un octet comme unité de base, bien que certains CPU 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 est alloué.

1
répondu Ryan Li 2011-01-07 15:06:21

bool peut être un octet -- la plus petite taille adressable de CPU, ou peut être plus grand. Il n'est pas inhabituel d'avoir bool de la taille de int à des fins de performance. 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 classe BitSet<N> ). Si vous êtes concerné par la taille de bool (vous avez probablement un grand conteneur,) alors vous pouvez emballer des bits vous-même ,ou utiliser std::vector<bool> cela le fera pour vous (faites attention avec ce dernier, car il ne satisfait pas les exigences du conteneur).

1
répondu Gene Bushuyev 2011-01-07 16:01:28

même si la taille minimale possible est de 1 Octet, vous pouvez avoir 8 bits d'information booléenne sur 1 octet:

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

Julia language a BitArray par exemple, et j'ai lu à propos des implémentations C++.

1
répondu Diego Javier Zea 2013-01-24 14:16:58

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

en général la taille de bits d'un cpu (par exemple 8 bits, 16 bits, 32 bits, etc) est une mesure de la plus petite taille de données qui peut être manipulée par le cpu-donc c'est aussi la taille de l'espace d'adresse. (Puisque les pointeurs et les données sont à plusieurs niveaux la même chose.).

0
répondu Hogan 2011-01-07 15:04:55

le byte est la plus petite unité de stockage numérique de données d'un ordinateur. Dans un ordinateur, la RAM a des millions d'octets et quiconque d'entre eux a une adresse. S'il avait une adresse pour chaque bit, un ordinateur pourrait gérer 8 fois moins de RAM que ce qu'il peut.

plus d'informations: Wikipedia

0
répondu Francesco Pasa 2011-01-07 15:09:24

pensez à la façon dont vous mettriez en œuvre ceci 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
répondu franji1 2011-01-07 21:18:20