10
votes

1 bit par bool en array c ++

bool fp[81];
From my understanding fp should use ceil(81/8) bytes because it is in succession.Am I correct? How can I prove this?

0 commentaires

7 Réponses :


0
votes

non, un bool est de 8 bits. Utilisez vecteur (un vecteur de bits spécialisé) ou bitset .


7 commentaires

Ou un boost :: dynamic_bitset, comme vecteur est mal.


@Johnny: il ne rencontre le Configuration de conteneurs .


Bool Être 8 bits n'est pas garanti.


-1 Non, la taille de bool est définie sur la mise en œuvre, pas nécessairement 8 bits.


Mais la taille de bool est garantie d'être au moins char_bit bits. C (++) ne fait pas d'emballage bit à l'exception des champs de bit.


@Zack: Et le héritage vecteur .


C'est la bibliothèque, pas la langue.



2
votes

Non, chaque bool est généralement stocké séparément ( généralement , en fonction de votre ordinateur, de 8 bits). La mémoire occupée serait un minimum de 81 octets.


0 commentaires

6
votes

Non, son 81 * taille de taille (bool) qui est probablement 81 octets


0 commentaires

3
votes

Vous pouvez trouver le stockage utilisé par n'importe quel objet ou type avec Tailleof:

int main() {
  bool fp[81];
  cout << sizeof fp << '\n';
  cout << sizeof(bool[81]) << '\n';
  return 0;
}


1 commentaires

Remarque Cela ne rapporte que la taille de l'objet réel sans la taille des ressources qu'il contrôle, telles que la mémoire allouée de manière dynamique: Tailleof (STD :: String) est une constante, même lorsqu'elle est appliquée à des cordes de longueur différente.



2
votes

Vous pouvez vérifier sa taille en utilisant Tailleof (FP) qui dans mon cas donne 81


0 commentaires

16
votes

Non, la taille de votre tampon est définie. Renvoyer la citation de la norme ci-dessous.

Par conséquent, la taille que vous pouvez attendre est de 81 * x où X est la taille de BOOL, qui est la mise en œuvre définie.

5,3,3 / 1 - "La taille de l'opérateur donne le nombre d'octets dans la représentation de l'objet de son opérande. L'opérande est une expression, qui n'est pas évalué, ni un identifiant de type parenthèses. La taille de l'opérateur ne doit pas être appliqué à une expression qui a une fonction ou un type incomplet, ou à un type d'énumération avant que tous ses énumérateurs aient été déclarés, ou au nom parenthèses de ces types, ou à un lvalue qui désigne un champ de bit. Tailleof (Char), Taillef (Char) et Tailleof (Taille non signée) sont 1; les Le résultat de la taille de l'application de tout autre type fondamental (3.9.1) est défini par la mise en œuvre. [ REMARQUE: En particulier, la taille de (bool) et la taille de (wchar_t) sont définies - définies.69) ] [Remarque: voir 1.7 pour la définition de l'octet et 3.9 pour la définition de la représentation de l'objet. ]


1 commentaires

Ceci est correct, mais manque un point critique, qui est que tailleof (bool) doit être supérieur ou égal à Tailleof (Char) , parce que tailleOf (char) est 1 par définition . [Oui, cela signifie qu'il serait diaboliquement difficile de faire une implémentation C conformable au C sur une machine adressable à un bit.] Par conséquent, quelle que soit la taille du tampon, il doit être au moins 81; Il ne peut pas être ceil (81/8).



1
votes

Utilisez un bitset si vous souhaitez être sûr que chaque bit sera considéré comme un peu plutôt que d'utiliser un octet pour une valeur totale: xxx

Vous devez comprendre que c'est un très faible Contrainte de la mémoire de niveau des processeurs et de leurs instructions, car elles sont conçues pour supporter des mots de bits, pas de bits. Cela aurait été une bonne chose que certaines instructions auraient été ajoutées à cette fin, car la chose Bitset fait que le bit est simplement un morve ...

J'ai vraiment besoin d'apprendre l'assemblage X86.


0 commentaires