Не существует действительно стандартизированного способа выравнивания структуры, но практическое правило выглядит так: вся структура выравнивается по границе 4 или 8 байтов (в зависимости от платформы). Внутри структуры каждый член выравнивается по размеру. Итак, следующие пакеты без подкладки:
char // 1
char
char
char
short int // 2
short int
int // 4
Это будет иметь общий размер 12. Однако следующий следующий вызовет заполнение:
char // 1, + 1 bytes padding
short // 2
int // 4
char // 1, + 1 byte padding
short // 2
char // 1
char // 1, + 2 bytes padding
Теперь структура занимает 16 байтов.
Это просто типичный пример, детали будут зависеть от вашей платформы. Иногда вы можете указать компилятору никогда не добавлять заполнение - это приведет к более дорогому доступу к памяти (возможно, к проблемам с параллелизмом), но сэкономит место.
Чтобы расположить агрегаты максимально эффективно, упорядочивайте элементы по размеру, начиная с самого большого.