Как правило, заполнение вставляется для обеспечения выравниваемого доступа к внутренним элементам структуры , а не для того, чтобы вся структура была размером в несколько слов.Выравнивание - это проблема реализации компилятора, а не требование стандарта C.
Итак, элементы char длиной 3 байта не нуждаются в выравнивании, поскольку они являются байтовыми элементами.
Этопредпочтительно, хотя и не обязательно, короткий элемент должен быть выровнен по короткой границе, что означает четный адрес.Выравнивая его по короткой границе, компилятор может выдать единственную короткую инструкцию загрузки, вместо того, чтобы загружать слово, маску и затем сдвиг.
В этом случае заполнение возможно, но не обязательно,происходит в конце, а не в середине.Вам нужно будет написать код для вывода адреса элементов, чтобы определить, где происходит заполнение.
РЕДАКТИРОВАТЬ: .Как упоминает @Euguen Sh, даже если вы обнаружите схему заполнения, которую компилятор использует для структуры, компилятор может изменить ее в другой версии компилятора.
Неразумно рассчитывать на схему заполнения компилятора.Всегда есть методы для доступа к элементам таким образом, что вы не угадаете при выравнивании.
Оператор sizeof () используется для того, чтобы увидеть, сколько памяти используется, и узнать, сколько будет добавлено в ptr в структуру, если этот указатель будет увеличен на 1 (ptr ++).
РЕДАКТИРОВАТЬ 2, Упаковка : Структуры могут быть упакованы для предотвращения заполнения, используя атрибут __packed__
.При проектировании конструкции целесообразно использовать элементы, которые естественным образом упаковываются.Это особенно важно при отправке данных по линии связи.Тщательно продуманная конструкция исключает необходимость прокладки в середине строения.Плохо спроектированная структура, которая затем компилируется с атрибутом __packed__
, может иметь внутренние элементы, которые не выровнены естественным образом.Можно было бы сделать это, чтобы гарантировать, что структура будет передавать по проводу, как это было первоначально разработано.Этот тип усилий уменьшился с введением JSON для передачи данных по проводам.