Pola bitowe języka C++
Klasy i struktury mogą zawierać elementy członkowskie, które zajmują mniej miejsca do magazynowania niż typ całkowity. Te elementy członkowskie są określane jako pola bitowe. Składnia specyfikacji deklaratora elementów członkowskich pola bitowego jest następująca:
Składnia
deklarator:wyrażenie-stałe
Uwagi
Deklarator (opcjonalny) to nazwa, do której jest uzyskiwany dostęp do elementu członkowskiego w programie. Musi być typem całkowitym (w tym typami wyliczonymi). Wyrażenie stałe określa liczbę bitów, które członek zajmuje w strukturze. Anonimowe pola bitowe — czyli elementy członkowskie pól bitowych bez identyfikatora — mogą być używane do uzupełniania.
Uwaga
Pole bitowe o szerokości 0 nienazwane wymusza wyrównanie następnego pola bitowego do granicy następnego typu , gdzie typ jest typem elementu członkowskiego.
Poniższy przykład deklaruje strukturę zawierającą pola bitowe:
// 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)
};
Koncepcyjny układ pamięci obiektu typu Date
przedstawiono na poniższej ilustracji:
32 bity pamięci są wyświetlane w wierszu. Począwszy od najmniej znaczącego bitu, 3 bity są dla nWeekDay. Następne 6 bitów są dla nMonthDay. Następne 5 bitów to nMonth. Następne 2 bity są nieużywane. Następne 8 bitów są przeznaczone dla nYear. Pozostałe 8 bitów są nieużywane.
nYear
ma długość 8 bitów, co spowodowałoby przepełnienie granicy słowa zadeklarowanego typu unsigned short
. W związku z tym rozpoczyna się od początku nowego unsigned short
elementu . Nie jest konieczne, aby wszystkie pola bitowe mieściły się w jednym obiekcie typu bazowego; przydzielane są nowe jednostki magazynu, zgodnie z liczbą bitów żądanych w deklaracji.
Specyficzne dla firmy Microsoft
Kolejność danych zadeklarowanych jako pola bitowe wynosi od niskiego do wysokiego bitu, jak pokazano na poprzedniej ilustracji.
END Microsoft Specific
Jeśli deklaracja struktury zawiera pole o długości 0 bez nazwy, jak pokazano w poniższym przykładzie:
// 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)
};
Następnie układ pamięci jest pokazany na poniższym rysunku:
64 bity pamięci są wyświetlane w wierszu. Począwszy od najmniej znaczącego bitu, 5 bitów to n Miesiąc. Następne 8 bitów to n Rok. Kolejne 19 bitów są nieużywane. Następne 3 bity są dla n WeekDay. Następne 6 bitów to n MonthDay. Pozostałe bity są nieużywane.
Podstawowy typ pola bitowego musi być typem całkowitym, zgodnie z opisem w artykule Typy wbudowane.
Jeśli inicjator odwołania const T&
typu jest wartością lvalue odwołującą się do pola bitowego typu T
, odwołanie nie jest powiązane bezpośrednio z polem bitowym. Zamiast tego odwołanie jest powiązane z tymczasowym zainicjowanym w celu przechowywania wartości pola bitowego.
Ograniczenia dotyczące pól bitowych
Poniższa lista zawiera szczegółowe informacje o błędnych operacjach na polach bitowych:
Biorąc adres bitowego pola.
Inicjowanie odwołania innego niż
const
pole bitowe.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Już wkrótce: w ciągu 2024 r. będziemy stopniowo usuwać problemy z usługą GitHub jako mechanizm opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla