Битовые поля в C++
Классы и структуры могут содержать члены, которые занимают меньше пространства в памяти, чем целочисленный тип. Эти члены определяются как битовые поля. Синтаксис спецификации элемента-декларатора битового поля выглядит следующим образом:
Синтаксис
декларатор:constant-expression
Замечания
Декларатор (необязательно) — это имя, с помощью которого член обращается к программе. Он должен иметь один из целочисленных типов (включая перечисляемые типы). Константное выражение указывает количество битов, которые занимает член в структуре. Анонимные битовые поля ( то есть члены битового поля без идентификатора) можно использовать для заполнения.
Примечание.
Неназванное битовое поле ширины 0 заставляет выравнивание следующего битового поля на следующую границу типа , где тип является типом элемента.
В следующем примере объявляется структура, которая содержит битовые поля:
// 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
показан на следующем рисунке:
32 бита памяти отображаются в строке. Начиная с наименьшего значения, 3 бита предназначены для nWeekDay. Следующие 6 битов предназначены для nMonthDay. Следующие 5 битов предназначены для nMonth. Следующие 2 бита не используются. Следующие 8 битов предназначены для nYear. Оставшиеся 8 битов не используются.
nYear
имеет длину 8 битов, что приведет к переполнению границы слова объявленного типа. unsigned short
Таким образом, он начинается в начале нового unsigned short
. Не обязательно, чтобы все битовые поля соответствовали одному объекту базового типа; новые единицы хранения выделяются в соответствии с количеством битов, запрошенных в объявлении.
Блок, относящийся только к системам Майкрософт
Порядок данных, объявленных как битовые поля, — от низкого до высокого, как показано на предыдущем рисунке.
Завершение блока, относящегося только к системам Майкрософт
Если объявление структуры содержит неназванное поле длиной 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)
};
Затем макет памяти показан на следующем рисунке:
64 бита памяти отображаются в строке. Начиная с наименьшего значительного бита, 5 битов в течение n месяца. Следующие 8 битов для n Года. Следующие 19 битов не используются. Следующие 3 бита для n WeekDay. Следующие 6 битов для n MonthDay. Остальные биты не используются.
Базовый тип битового поля должен быть целочисленным типом, как описано в встроенных типах.
Если инициализатор для ссылки const T&
типа является lvalue, который ссылается на битовое поле типа T
, ссылка не привязана к битовому полю напрямую. Вместо этого ссылка привязана к временной инициализированной для хранения значения битового поля.
Ограничения для битовых полей
В следующем списке указаны ошибочные операции с битовыми полями:
Получение адреса битового поля.
Инициализация ссылки, отличной
const
от ссылки, с помощью битового поля.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по