Freigeben über


C++-Bitfelder

Klassen und Strukturen können Member enthalten, die weniger Speicher als ein ganzzahliger Typ belegen. Diese Member werden als Bitfelder angegeben. Im Folgenden finden Sie die Syntax für die member-declarator-Bitfeldangabe:

Syntax

Deklarator : konstanter Ausdruck

Hinweise

Der (optionale) Deklarator ist der Name, über den der Zugriff auf den Member im Programm erfolgt. Es muss ein ganzzahliger Typ sein (einschließlich Enumerationstypen). constant-expression gibt die Anzahl von Bits an, die der Member in der Struktur einnimmt. Anonyme Bitfelder, also Bitfeldmember ohne Bezeichner, können zur Auffüllung verwendet werden.

Hinweis

Ein unbenanntes Bitfeld der Breite 0 (null) erzwingt die Ausrichtung des nächsten Bitfelds an der nächsten Typ-Grenze, wobei Typ den Typ des Members angibt.

Das folgende Beispiel deklariert eine Struktur, die zwei Bitfelder enthält:

// 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)
};

Das konzeptionelle Speicherlayout eines Objekts vom Typ Date wird in der folgenden Abbildung dargestellt:

Diagramm des Speicherlayouts eines Datumsobjekts, das zeigt, wo sich die Felder

32 Bit Arbeitsspeicher werden in einer Zeile angezeigt. Beginnend mit dem am wenigsten signifikanten Bit sind 3 Bit für nWeekDay. Die nächsten 6 Bits gelten für nMonthDay. Die nächsten 5 Bits gelten für nMonth. Die nächsten 2 Bits werden nicht verwendet. Die nächsten 8 Bits sind für nYear. Die verbleibenden 8 Bits werden nicht verwendet.

nYear ist 8 Bit lang, die die Wortgrenze des deklarierten Typs unsigned short überlaufen würde. Daher beginnt es am Anfang eines neuen unsigned short. Es ist nicht notwendig, dass alle Bitfelder in ein Objekt des zugrunde liegenden Typs passen. Neue Speichereinheiten werden entsprechend der Anzahl von Bits, die in der Deklaration angefordert werden, zugeordnet.

Microsoft-spezifisch

Die Daten, die als Bitfelder deklariert werden, werden beginnend mit dem niedrigsten Bitwert bis hin zum höchsten Bitwert aufgeführt, wie in der vorherigen Abbildung dargestellt.

Ende Microsoft-spezifisch

Wenn die Deklaration einer Struktur ein unbenanntes Feld mit der Länge 0 (null) enthält, wie im folgenden Beispiel gezeigt:

// 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)
};

Dann folgt das Speicherlayout der in der folgenden Abbildung dargestellten Struktur:

Diagramm des Layouts eines Date-Objekts mit einem Bitfeld der Länge Null, das die Ausrichtung des Abstands erzwingt.

64 Bit Arbeitsspeicher werden in einer Zeile angezeigt. Beginnend mit dem am wenigsten signifikanten Bit sind 5 Bit für n Month. Die nächsten 8 Bits sind für n Year. Die nächsten 19 Bits werden nicht verwendet. Die nächsten 3 Bits gelten für n WeekDay. Die nächsten 6 Bits gelten für n MonthDay. Die verbleibenden Bits werden nicht verwendet.

Der zugrunde liegende Typ eines Bitfelds muss ein ganzzahliger Typ sein, wie unter integrierte Typen beschrieben.

Wenn der Initialisierer für einen Verweis des Typs const T& ein Wert ist, der auf ein Bitfeld vom Typ T verweist, wird der Verweis nicht direkt an das Bitfeld gebunden. Stattdessen wird der Verweis an einen temporären initialisierten Wert gebunden, um den Wert des Bitfelds zu speichern.

Einschränkungen bei Bitfeldern

Die folgende Liste zeigt Einzelheiten zu fehlerhaften Operationen in Bitfeldern:

  • Verwenden der Adresse eines Bitfelds.

  • Initialisieren eines nicht-const Verweises mit einem Bitfeld.

Weitere Informationen

Klassen und Strukturen