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 :
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.
nYear
est 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 :
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 T
bit, 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 sans
const
référence avec un champ de bits.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour