Как определяется / измеряется размер структуры с битовыми полями?

#include  typedef struct size { unsigned int a:1; unsigned int b:31; unsigned int c:1; } mystruct; int main() { mystruct a; printf("%d", sizeof(a)); return 0; } 
  • С int b:31 выход равен 8.
  • С int b:1 выход равен 4.
  • С int b:32 , выход 12.

Может ли кто-нибудь объяснить причину этого?

Вы не говорите, знаете ли вы, какие битовые поля, но я предполагаю, что вы это делаете.

По вашей реализации, очевидно, unsigned int представляет собой 32-битное целое число, занимающее 4 байта. Это объясняет первый и второй примеры. Очевидно, что 3 битовых поля, составляющих 33 бита, не вписываются в один unsigned int , поэтому в первом примере требуется 8 байтов. 3 битовых поля, суммирующих 3 бита, безусловно, вписываются в unsigned int , а значит, только 4 байта во втором примере.

Кроме того, битовое поле не может охватывать несколько целых чисел. Это объясняет третий пример. Я не могу вспомнить, является ли это требованием стандарта или просто деталью вашей реализации. В любом случае, поскольку b – 32 бита, он заполняет целый unsigned int по себе, заставляя как a и c занимать свой собственный unsigned int до и после середины. Следовательно, 12 байт.

Это порядок, который имеет значение. Следующий код даст Output: 8

 #include typedef struct size { unsigned int b:32; unsigned int a:1; unsigned int c:1; }mystruct; int main(int argc, char const *argv[]) { mystruct a; printf("\n %lu \n",sizeof(a)); return 0; } 

Unsigned int – 32-битное целое число, занимающее 4 байта. Память распределена смежно в памяти.


Опция 1:

 unsigned int a:1; // First 4 bytes are allocated unsigned int b:31; // Will get accomodated in the First 4 bytes unsigned int c:1; // Second 4 bytes are allocated 

Выход: 8


Вариант 2:

 unsigned int a:1; // First 4 bytes are allocated unsigned int b:32; // Will NOT get accomodated in the First 4 bytes, Second 4 bytes are allocated unsigned int c:1; // Will NOT get accomodated in the Second 4 bytes, Third 4 bytes are allocated 

Выход: 12


Вариант 3:

 unsigned int a:1; // First 4 bytes are allocated unsigned int b:1; // Will get accomodated in the First 4 bytes unsigned int c:1; // Will get accomodated in the First 4 bytes 

Выход: 4


Вариант 4:

 unsigned int b:32; // First 4 bytes are allocated unsigned int a:1; // Second 4 bytes are allocated unsigned int c:1; // Will get accomodated in the Second 4 bytes 

Выход: 8

центровка

Компилятор округляет размер структуры до 32 бит, размер каждого объекта, который он может попытаться ссылаться на 32 бита, и в то же время сохраняет порядок ваших битовых полей.

Итак, если у вас есть 32-битный элемент в среднем и 1-битном элементах с каждой стороны, это 3 32-битных слова для выделения и так: 12 байт.

Для остальных двух случаев речь идет только о том, как мало 32-битных объектов можно добавить в последовательность битовых полей, сохраняя при этом порядок полей.

Согласно ответу Стив Джессопа, просто чтобы выполнить свой ответ, добавив некоторые документы, которые могут помочь.

Член структуры или объединения может иметь любой полный тип объекта, отличный от измененного типа. Кроме того, член может быть объявлен состоящим из определенного количества бит (включая знаковый бит, если таковой имеется). Такой член называется битовым полем, его ширине предшествует двоеточие

Реализация может выделять любой адресный блок хранения, достаточно большой для хранения битового поля. Если остается достаточно места, бит-поле, которое сразу следует за другим битовым полем в структуре, должно быть упаковано в соседние биты того же блока. Если недостаточно места, то будет ли бит-поле, которое не подходит, помещается в следующий блок или перекрывает смежные единицы, определяется реализацией. Порядок распределения бит-полей внутри единицы (от высокого порядка до младшего или низкого порядка) определяется реализацией. Выравнивание адресного блока хранения не указывается.

Внутри объекта структуры члены небитового поля и единицы, в которых расположены битовые поля, имеют адреса, которые увеличиваются в том порядке, в котором они объявлены . Указатель на объект структуры, соответствующим образом преобразованный, указывает на его первоначальный член (или если этот элемент является битовым полем, а затем блоку, в котором он находится) и наоборот. В структурном объекте может быть неназванное дополнение, но не в начале.

–ISO / IEC 9899: 201x 6.7.2.1

Interesting Posts

Утилита отключения дисплея ноутбука

OpenCv 2.3 C – Как изолировать объект внутри изображения

Как узнать, что пользователь нажал кнопку «X» или «Закрыть»?

Я случайно подключил USB-мышь к своему порту eSata … он работает?

Struts2 Нет действия, отображаемого для пространства имен и имени действия , связанного с контуром контекста

Регулярное выражение для соответствия имени DNS-сервера или IP-адресу?

Область доступа AngularJS от внешней функции js

Можете ли вы указать git-shell в .ssh / authorized_keys для ограничения доступа только к git-командам через ssh?

Мой экран ноутбука продолжает мерцать

Мне нужно установить MVC 3/4 на веб-сервере для запуска приложения mvc

SVG для Android Shape

Простая реализация C для отслеживания памяти malloc / free?

Что означают два знака вопроса в C #?

Есть ли способ сделать n-уровневые вложенные циклы в Java?

Как правильно сортировать календарные месяцы «ммм» с помощью AutoFilter?

Давайте будем гением компьютера.