Campi di bit C++
Le classi e le strutture possono contenere membri che occupano meno archiviazione che un tipo integrale.Questi membri vengono specificati come campi di bit.la sintassi per il campo di bit membro-dichiaratore la specifica seguenti:
declarator : constant-expression
Note
(Facoltativo) declarator è il nome che il membro avviene nel programma.Deve essere un tipo integrale (tipi enumerati inclusi).espressione costante specifica il numero di bit che il membro occupa della struttura.I campi di bit anonimi, ovvero membri campo di bit senza identificatore - possono essere utilizzati per aggiungere.
[!NOTA]
Un campo di bit senza nome della larghezza 0 potrebbe l'allineamento del campo di bit seguente all'altro type limite, dove type è il tipo del membro.
Nell'esempio seguente viene dichiarata una struttura contenente i campi di bit:
// 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)
};
il layout concettuale di memoria di un oggetto di tipo Date nella figura che segue viene illustrato.
Layout di memoria di oggetto date
si noti che nYear è lunga 8 bit e supererebbero il confine di parola del tipo dichiarato, short senza segno.Di conseguenza, viene avviata all'inizio di un nuovo short senza segno.Non è necessario che tutti i campi di bit si adattino a un oggetto del tipo sottostante, le nuove funzioni di archiviazione sono allocate, a seconda del numero di bit della dichiarazione.
Specifici di Microsoft
L'ordine dei dati dichiarati come campi di bit corrisponde al minimo al bit significativi, come illustrato nella figura precedente.
Microsoft FINALE specifico
Se la dichiarazione di una struttura include un campo senza nome di lunghezza 0, come illustrato nell'esempio seguente,
// 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)
};
il layout di memoria è come illustrato nella figura seguente.
Layout di oggetto date con il campo di bit di lunghezza zero
Il tipo sottostante del campo di bit deve essere un tipo integrale, come descritto in tipi fondamentali.