Не совсем.
Заполнение зависит от требования выравнивания следующего элемента. Естественным выравниванием встроенных типов данных является их размер.
Заполнение перед элементами char отсутствует, поскольку их требование выравнивания равно 1 (при условии, что char равен 1 байту).
Например, если за символом (снова предположим, что это один байт) следует короткое замыкание, которое, скажем, составляет 2 байта, может быть до 1 байта заполнения, поскольку короткое замыкание должно быть выровнено по 2 байта. Если за символом следует двойное значение размера 8, может быть до 7 байтов заполнения, потому что двойное выравнивается по 8 байтов. С другой стороны, если после короткого замыкания следует двойное, может быть до 6 байтов заполнения.
И размер структуры кратен выравниванию элемента с наибольшим требованием выравнивания, поэтому может быть добавление хвоста. В следующей структуре, например,
struct baz {
double d;
char c;
};
элемент с наибольшим требованием выравнивания равен d, его требование выравнивания равно 8, что дает sizeof (baz) == 2 * alignof (double). После элемента c имеется 7 байтов заполнения хвоста.
gcc и другие современные компиляторы поддерживают оператор __alignof (). Существует также портативная версия в Boost.