Принимая во внимание, как описание положений стандарта языка C, ваш текст предъявляет необоснованные претензии. В частности, стандарт не не только говорит о том, что unsigned int
является базовой единицей размещения структур любого вида, он явно отказывается от любых требований к размеру блоков хранения, в которых хранятся представления битовых полей:
Реализация может выделять любую адресуемую единицу памяти большой
достаточно для хранения битового поля.
( C2011, 6.7.2.1/11)
В тексте также содержатся допущения относительно заполнения, которые не поддерживаются стандартом. Реализация C свободна включать произвольное количество заполнения после любого или всех элементов и блоков хранения битового поля struct
, включая последний. Реализации, как правило, используют эту свободу для учета соображений выравнивания данных, но C не ограничивает заполнение этим использованием. Это в целом отделено от неназванных битовых полей, которые ваш текст называет «padding».
Я полагаю, что книгу следует рекомендовать, однако, чтобы избежать печально распространенного заблуждения о том, что C требует, чтобы объявленный тип данных битового поля имел какое-либо отношение к размеру единицы (единиц) хранения, в которой находится его представление , Стандарт не устанавливает такой ассоциации.
Почему в моем компиляторе точно такая же структура измеряет 16 байтов (а не бит) с заполнением и 16 байтов без заполнения?
Чтобы сократить текст настолько, насколько это возможно, он различает количество бит данных, занятых элементами (всего 16 бит, 6 принадлежащих неназванным битовым полям), и общий размер экземпляров struct
. Кажется, утверждается, что общая структура будет иметь размер unsigned int
, который, по-видимому, составляет 32 бита в системе, которую она описывает, и это будет одинаково для обеих версий структуры.
В принципе, ваши наблюдаемые размеры могут быть объяснены вашей реализацией, использующей 128-битный блок хранения для битовых полей. На практике он, вероятно, использует один или несколько меньших блоков хранения, так что некоторая часть дополнительного пространства в каждой структуре относится к заполнению, предоставляемому реализацией, как я касался выше.
Для реализаций C очень распространено наложение минимального размера на все типы структур и, следовательно, при необходимости добавление представлений к этому размеру. Часто этот размер соответствует строжайшему требованию выравнивания любого типа данных, поддерживаемого системой, хотя это опять-таки соображение реализации, а не требование языка.
Итог: только полагаясь на детали реализации и / или расширения, вы можете предсказать точный размер struct
, независимо от наличия или отсутствия элементов битового поля.