Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 déclarateur-de-membre de champ de bits est la suivante :
Syntaxe
déclarateur : expression-constante
Notes
Le déclarateur (facultatif) est le nom permettant d’accéder au membre dans le programme. Il doit s'agir d'un type intégral (y compris les types énumérés). 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 de bits sans identificateur, peuvent être utilisés pour le remplissage.
Remarque
Un champ de bits sans nom de largeur 0 force l’alignement du champ de bits suivant à la limite de type suivante, où type représente 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 de mémoire conceptuelle d’un objet de type Date
est illustrée dans la figure suivante :
32 bits de mémoire sont affichés sur une ligne. En commençant par le bit le moins significatif, 3 bits sont utilisés pour nWeekDay. Les 6 bits suivants correspondent à nMonthDay. Les 5 bits suivants correspondent à nMonth. Les 2 bits suivants sont inutilisés. Les 8 bits suivants correspondent à nYear. Les 8 bits restants sont inutilisés.
nYear
a une longueur de 8 bits, ce qui dépasse la limite de mot du type déclaré, unsigned short
. Il commence donc au début d’un nouveau unsigned short
. Il n’est pas nécessaire que tous les champs de bits tiennent dans un seul 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
Le classement des données déclarées en tant que champs de bits s’étend du bit de poids faible au bit de poids fort, comme le montre 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 le montre 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 mémoire se présente alors comme le montre la figure suivante :
64 bits de mémoire sont affichés sur une ligne. En commençant par le bit le moins significatif, 5 bits sont utilisés pour nMonth. Les 8 bits suivants correspondent à nYear. Les 19 bits suivants sont inutilisés. Les 3 bits suivants correspondent à nWeekDay. Les 6 bits suivants correspondent à nMonthDay. Les bits restants sont inutilisés.
Le type sous-jacent d’un champ de bits doit être un type intégral, comme indiqué dans 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 bits de type T
, la référence n’est pas liée directement au champ de bits. À la place, la référence est liée à l’initialisation d’un objet temporaire destiné à contenir la valeur du champ de bits.
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 non
const
avec un champ de bits.