Champs de bits C++
Les classes et les structures peuvent contenir des membres qui occupent moins de stockage qu'un type intégral. Ces membres sont spécifiés comme champs d'octets. La syntaxe pour la spécification déclarateurs de membres de champ d'octets est la suivante :
declarator : constant-expression
Notes
Le (facultatif) declarator est le nom par lequel le membre est accessible dans le programme. Ce doit être un type intégral (en incluant types énumérés). expression constante spécifie le nombre de bits que le membre occupe dans la structure. Les champs d'octets anonymes — Autrement dit, les membres de champ d'octets sans identificateur — peuvent être utilisés pour faire des marges.
Notes
Un champ d'octets sans nom de la largeur 0 force l'alignement du champ d'octets suivant à la limite suivante pour type, où type est le type du membre.
L'exemple suivant déclare une structure qui contient des champs d'octets :
// 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 mémoire d'un objet de type Date est illustrée ci-dessous.
Disposition de la mémoire d'un objet Date
Notez que nYear a une longueur de 8 octets et provoquerait un dépassement de la limite de mot du type déclaré, unsigned short. Par conséquent, il est lancé au début d'un nouveau unsigned short. Il n'est pas nécessaire que tous les champs d'octets tiennent dans un objet du type sous-jacent ; de nouvelles unités de stockage sont allouées, selon le nombre d'octets demandés dans la déclaration.
Spécifique à Microsoft
Commande de données déclarées comme champs d'octets est du bas vers l'octet élevé, comme indiqué dans l'illustration ci-dessus.
END Spécifique à Microsoft
Si la déclaration d'une structure comprend une zone sans nom de longueur 0, comme indiqué 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)
};
la disposition de la mémoire est comme indiqué dans l'illustration suivante.
Disposition d'un objet Date avec un champ d'octets de longueur 0
Le type sous-jacent d'un champ d'octets doit être un type intégral, comme décrit dans Types fondamentaux.