C++-Bitfelder

Klassen und Strukturen können Member enthalten, die weniger Speicher als ein ganzzahliger Typ belegen. Diese Member werden als Bitfelder angegeben. Die Syntax für die Spezifikation der Bitfeld-Member-Deklarator folgt:

Syntax

deklarator:constant-expression

Hinweise

Der (optionale) Deklarator ist der Name, nach dem im Programm auf das Mitglied zugegriffen wird. Es muss ein ganzzahliger Typ sein (einschließlich Enumerationstypen). Der Konstantenausdruck gibt die Anzahl der Bits an, die das Element in der Struktur belegt. Anonyme Bitfelder – d. h. Bitfeldmber ohne Bezeichner – können zum Auffüllen verwendet werden.

Hinweis

Ein unbenannte Bitfeld mit Breite 0 erzwingt die Ausrichtung des nächsten Bitfelds an die nächste Typgrenze , wobei typ der Typ des Elements ist.

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 Typobjekts Date wird in der folgenden Abbildung gezeigt:

Diagram of the memory layout of a date object, showing where the n WeekDay, n MonthDay, n Month, and n Year bit fields are located.

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 erneute Standard 8 Bits werden nicht verwendet.

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

Microsoft-spezifisch

Die Reihenfolge von Daten, die als Bitfelder deklariert werden, ist von niedriger bis hoher Bit,wie in der vorherigen Abbildung dargestellt.

Ende Microsoft-spezifisch

Wenn die Deklaration einer Struktur ein unbenannte Feld der Länge 0 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)
};

Anschließend ist das Speicherlayout wie in der folgenden Abbildung dargestellt:

Diagram of the layout of a Date object, with a zero length bit field, which forces alignment padding.

64 Bit Arbeitsspeicher werden in einer Zeile angezeigt. Beginnend mit dem am wenigsten signifikanten Bit sind 5 Bit für n Monat. 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 Standard erneuten Bits werden nicht verwendet.

Der zugrunde liegende Typ eines Bitfelds muss ein integraler Typ sein, wie in integrierten Typen beschrieben.

Wenn der Initialisierer für einen Verweis des Typs const T& ein Wert ist, der auf ein Bitfeld vom Typ Tverweist, 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 Nichtverweissconst mit einem Bitfeld.

Siehe auch

Klassen und Strukturen