Чтобы вычислить размеры пользовательских типов, компилятор учитывает любое выравнивание пространство, необходимое для сложных пользовательских структур данных.Вот почему размер структуры в C может быть больше, чем сумма размеров ее членов.Например, во многих системах следующий код будет печатать 8 :
struct student{
char grade; /* char is 1 byte long */
int age; /* int is 4 bytes long */
};
printf("%zu", sizeof (struct student));
Причина этого заключается в том, что большинство компиляторов по умолчанию выравнивают сложные структуры данных в word граница выравнивания.Кроме того, отдельные элементы также выровнены по соответствующим границам выравнивания.По этой логике учащийся структуры выравнивается по границе слова, а переменная age в структуре выравнивается по адресу следующего слова.Это достигается за счет того, что компилятор вставляет пробел между двумя элементами или до конца структуры, чтобы удовлетворить требования выравнивания.Этот отступ вставляется, чтобы выровнять возраст по границе слова.(Большинство процессоров могут извлечь выровненное слово быстрее, чем они могут извлечь значение слова, которое занимает несколько слов в памяти, а некоторые вообще не поддерживают операцию)
Ссылка на статью: выравнивание структуры данных и Заполнение структуры