Битовые поля в C++
Классы и структуры могут содержать члены, которые занимают меньше пространства в памяти, чем целочисленный тип. Эти члены определяются как битовые поля. Спецификация члена-декларатора битового поля имеет следующий синтаксис:
declarator : constant-expression
Заметки
Параметр (необязательный) declarator представляет собой имя, по которому этот член будет доступен программе. Он должен иметь один из целочисленных типов (включая перечисляемые типы). Параметр constant-expression задает количество битов, которые член занимает в структуре. Анонимные битовые поля, (т. е. битовые поля без идентификатора) можно использовать для заполнения.
Примечание
Неименованное битовое поле шириной 0 обеспечивает выравнивание следующего битового поля по следующей границе type, где type обозначает тип члена.
В следующем примере объявляется структура, которая содержит битовые поля:
// 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)
};
На следующем рисунке показана концептуальная структура памяти для объекта типа Date.
Структура памяти объекта типа Date
Обратите внимание, что nYear на 8 бит длиннее и может переполнить границу слова для объявленного типа, unsigned short. Поэтому он находится в начале нового слова unsigned short. Совсем не обязательно, чтобы все битовые поля помещались в один объект базового типа; в зависимости от количества бит, запрошенных в объявлении, выделяются новые единицы хранения.
Блок, относящийся только к системам Microsoft
Данные, объявленные в качестве битовых полей, упорядочиваются от младшего бита к старшему, как показано на рисунке выше.
Завершение блока, относящегося только к системам Microsoft
Объявление структуры может содержать неименованное поле длиной 0, как показано в следующем примере.
// 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)
};
Структура памяти для такого случая представлена на следующем рисунке.
Структура объекта типа Date с битовым полем нулевой длины
Базовый тип битового поля должен иметь целочисленный тип, как описано в разделе Основные типы.