Champs de bits C++

Les classes et les structures peuvent contenir des membres qui occupent moins d'espace de stockage qu'un type intégral. Ces membres sont spécifiés en tant que champs de bits. La syntaxe de la spécification de déclarateur membre de champ de bits suit :

Syntaxe

declarator :constant-expression

Notes

Le déclarateur (facultatif) est le nom par lequel le membre est accessible dans le programme. Il doit s'agir d'un type intégral (y compris les types énumérés). L’expression constante spécifie le nombre de bits occupés par le membre dans la structure. Les champs de bits anonymes( c’est-à-dire les membres de champ binaire sans identificateur) peuvent être utilisés pour le remplissage.

Remarque

Un champ de bits sans nom de largeur 0 force l’alignement du champ bit suivant à la limite de type suivant, où le type est le type du membre.

L'exemple suivant déclare une structure qui contient des champs de bits :

// bit_fields1.cpp
// compile with: /LD
struct Date {
   unsigned short nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned short nMonthDay : 6;    // 0..31  (6 bits)
   unsigned short nMonth    : 5;    // 0..12  (5 bits)
   unsigned short nYear     : 8;    // 0..100 (8 bits)
};

La disposition conceptuelle de la mémoire d’un objet de type Date est illustrée dans la figure suivante :

Diagram of the memory layout of a date object, showing where the n WeekDay, n MonthDay, n Month, and n Year bit fields are located.

32 bits de mémoire sont affichés dans une ligne. À compter du bit le moins significatif, 3 bits sont destinés à nWeekDay. Les 6 bits suivants sont destinés à nMonthDay. Les 5 bits suivants concernent nMonth. Les 2 bits suivants ne sont pas utilisés. Les 8 bits suivants sont pour nYear. Les 8 bits restants ne sont pas utilisés.

nYearest long de 8 bits, ce qui dépasserait la limite de mot du type déclaré. unsigned short Par conséquent, il commence au début d’un nouveau unsigned short. Il n’est pas nécessaire que tous les champs de bits s’intègrent dans un objet du type sous-jacent ; de nouvelles unités de stockage sont allouées, en fonction du nombre de bits demandés dans la déclaration.

Section spécifique à Microsoft

L’ordre des données déclarées en tant que champs de bits est de bas à haut, comme indiqué dans la figure précédente.

FIN de la section spécifique à Microsoft

Si la déclaration d’une structure inclut un champ sans nom de longueur 0, comme illustré dans l’exemple suivant :

// bit_fields2.cpp
// compile with: /LD
struct Date {
   unsigned nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned nMonthDay : 6;    // 0..31  (6 bits)
   unsigned           : 0;    // Force alignment to next boundary.
   unsigned nMonth    : 5;    // 0..12  (5 bits)
   unsigned nYear     : 8;    // 0..100 (8 bits)
};

Ensuite, la disposition de la mémoire est illustrée dans la figure suivante :

Diagram of the layout of a Date object, with a zero length bit field, which forces alignment padding.

64 bits de mémoire sont affichés dans une ligne. À compter du bit le moins significatif, 5 bits sont destinés à n Mois. Les 8 bits suivants sont pour n Year. Les 19 bits suivants ne sont pas utilisés. Les 3 bits suivants sont pour n WeekDay. Les 6 bits suivants concernent n MonthDay. Les bits restants ne sont pas utilisés.

Le type sous-jacent d’un champ de bits doit être un type intégral, comme décrit dans les types intégrés.

Si l’initialiseur d’une référence de type const T& est une valeur lvalue qui fait référence à un champ de type Tbit, la référence n’est pas liée directement au champ bit. Au lieu de cela, la référence est liée à un initialisé temporaire pour contenir la valeur du champ bit.

Restrictions sur les champs de bits

La liste suivante détaille les opérations erronées sur les champs de bits :

  • Prise de l'adresse d'un champ de bits.

  • Initialisation d’une référence sansconst référence avec un champ de bits.

Voir aussi

Classes et structs