Champ de bits vs Bitset
Je veux stocker dans un tableau (comme la structure). Donc, je peux suivre l'une des deux approches suivantes
Approche numéro 1 (1)
struct BIT
{
int data : 1
};
int main()
{
BIT a[100];
return 0;
}
Approche numéro 2 (2)
int main()
{
std::bitset<100> BITS;
return 0;
}
Pourquoi quelqu'un préfère UN 2 sur UN 1?
source d'informationauteur CLOWN | 2010-10-22
Vous devez vous connecter pour publier un commentaire.
Parce que l'approche nr. 2 utilise 100 bits de stockage, ainsi que quelques petits (constante) les frais généraux, tout en nr. 1 utilise généralement quatre octets de stockage par
Bit
structure. En général, unstruct
est au moins un octet grand par la norme C++.imprime
En dehors de cela,
bitset
enveloppe votre tableau de bits dans une belle représentation des objets avec de nombreuses opérations.Un bon choix dépend de la façon dont vous allez utiliser les bits.
std::bitset<N>
est de taille fixe. Visual C++ 10.0 est non conforme wrt. pour les constructeurs; en général, vous devez fournir une solution de contournement. C'était, paradoxalement, en raison de ce que Microsoft a pensé a un bug-fix -- ils ont introduit un constructeur prenantint
argument, que je me souviens.std::vector<bool>
est optimisé dans beaucoup de la même manière questd::bitset
. Coût: l'indexation n'est pas directement fournir une référence (il n'y a pas de références pour les bits en C++), mais au lieu de cela renvoie un objet proxy, ce qui n'est pas quelque chose que vous remarquez jusqu'à ce que vous essayez de l'utiliser comme référence. Avantage: peu de rangement, et le vecteur peut être redimensionnée selon les besoins.Simplement en utilisant par exemple
unsigned
est également une option, si vous allez traiter avec un petit nombre de bits (dans la pratique, 32 ou moins bien que la garantie formelle est de 16 bits).Enfin, TOUTES les MAJUSCULES identificateurs sont, par convention (à l'exception de Microsoft) réservés pour les macros, afin de réduire la probabilité de collisions de noms. C'est donc une bonne idée de ne pas utiliser TOUTES les lettres MAJUSCULES identifiants pour autre chose que des macros. Et de toujours utiliser TOUTES les lettres MAJUSCULES des identificateurs pour les macros (cela rend également plus facile de les reconnaître).
Cheers & hth.,
bitset a plus d'opérations
Approche numéro 1 sera très probablement être compilés dans un tableau d'entiers de 4 octets, et un peu de chacun d'eux sera utilisé pour stocker vos données. Théoriquement, une smart compilateur peut optimiser cela, mais je ne voudrais pas compter sur elle.
Est-il une raison vous ne souhaitez pas utiliser
std::bitset
?Pour citer cplusplus.com's page sur bitset"La classe est très similaire à un tableau normal, mais l'optimisation de l'allocation de l'espace". Si votre entiers de 4 octets, un bitset utilise 32 fois moins d'espace.
Même en faisant
bool bits[100]
comme le sbi a suggéré, est encore pire que bitset, parce que la plupart des implémentations avez - >= 1-byte bool.Si, pour des raisons de curiosité intellectuelle seulement, vous avez voulu mettre en place votre propre bitset, vous pouvez le faire en utilisant des masques de bits:
(Désolé pour l'utilisation d'une structure au lieu d'une classe par la voie. Je suis en train de penser à droite C parce que je suis au milieu d'un faible niveau de devoirs pour l'école. Évidemment, deux énormes avantages de l'utilisation d'une classe sont la surcharge d'opérateur et la possibilité d'avoir un tableau de taille variable.)