Я читал документацию GNU/GCC и остановился на описании __attribute__ ((packed)).
Там говорится:
упакованный
Упакованный атрибут указывает, что переменная или поле структуры должно иметь минимально возможное выравнивание — один байт для переменной и один бит для поля, если только вы не укажете большее значение с помощью атрибута выравнивания.
Вот структура, в которой поле x упаковано так, что оно следует сразу за a:
struct foo { char a; int x[2] __attribute__ ((packed)); };
Интересно, как именно работает этот атрибут и является ли этот код:
struct bar
{
char a:1 __attribute__ ((packed));
};
создаст 1-битную структуру вместо 1-байтовой.
В цитируемом тексте указан один байт для переменной. Это struct foo var; переменная.
Ключевое утверждение: «наименьшее возможное выравнивание». Выравнивание относится к байтам, а не к битам.





Байт — это наименьшая адресуемая единица. Таким образом, структуры могут занимать только целое число байтов, а не дробные байты.
Любые неиспользуемые биты в битовых полях (точнее, в единицах хранения, содержащих битовые поля) становятся заполнением.
Итак, в вашем примере struct bar размер структуры по-прежнему будет равен 1, при этом 1 бит используется и 7 бит не используются.
Стоит отметить, что даже пустой struct имеет размер не менее одного байта. Если оно не может быть меньше одного байта, то и что-то, содержащее битовое поле, тоже не может. Мне интересно поместить packed «один бит struct» в другой packed struct, у которого есть битовое поле.
Значит, это не окажет существенного влияния на struct bar?
@Glitch Правильно, см. редактирование.
@JanSchultke Я считаю, что это только для C++. gcc показывает, что такая структура имеет размер 0. Я подозреваю, что определение такой структуры - это UB в C, но до сих пор я не нашел окончательного утверждения об этом.
@JanSchultke Пустая структура — это как минимум один байт в C++, но не в C. В C++ разные объекты должны иметь разные адреса.
@dbush: О «определенном»: C 2018 6.2.6.1 2, «За исключением битовых полей, объекты состоят из смежных последовательностей одного или нескольких байтов…», и C 2018 6.7.2.1 8, «… Если структура- список-деклараций не содержит никаких именованных членов ни напрямую, ни через анонимную структуру или анонимное объединение, поведение неопределенно…»
@EricPostpischil Спасибо, я собирался предложить struct { int :0; } как допустимый тип, пока вы не указали на это!
«Байт — это наименьшая адресуемая единица». --> Хм, возможно, графический процессор с адресом для каждого бита может указывать на что-то уже, чем 8 бит, но модель C не поддерживает это.
sizeof(foo)— целое число