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:
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.
nYear
ist 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:
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 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 Nichtverweiss
const
mit einem Bitfeld.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für