Это вызвано заполнением.
Компилятор добавляет отступы:
- чтобы сделать доступ к членам максимально быстрым
- также для создания массивов пакета объектов для обеспечения эффективного доступа к элементам.
Таким образом, объекты, имеющие размер 1, могут быть выровнены по границам в 1 байт и при этом легко / эффективно считываться. В то время как объекты размером 4 должны быть выровнены по 4-байтовым границам (в зависимости от вашего компилятора) (технически вы можете выровнять по 1-байтовым границам, но это означает, что вам обычно требуется несколько инструкций для извлечения и объединения, и таким образом это более эффективно записывать до 4 байтовых границ)).
Таким образом, для оптимального выравнивания конструкций лучше всего упорядочить элементы по размеру (сначала по величине). Это даст вам оптимальную стратегию упаковки в большинстве нормальных ситуаций.
Это не остановит ваш объект размером восемь байт.
В качестве компилятора также учитывается, что ваш класс может использоваться в массивах. Таким образом, каждый элемент в массиве должен быть выровнен так, чтобы самый большой элемент каждого элемента был выровнен соответствующим образом.