Элементы класса и структуры требуются стандартом для хранения в памяти в том же порядке, в котором они объявлены. Таким образом, в вашем примере было бы невозможно, чтобы d
отображался до b
.
Кроме того, большинство архитектур предпочитают, чтобы многобайтовые типы выровнялись на границах 4 или 8 байтов. Таким образом, все, что может сделать компилятор, это оставить пустые байты заполнения между членами класса.
Вы можете минимизировать заполнение путем изменения порядка членов, увеличивая или уменьшая порядок размеров. Или у вашего компилятора может быть опция #pragma pack
или что-то подобное, что будет стремиться минимизировать заполнение при возможном расходе производительности и размера кода. Прочитайте документы для своего компилятора.