Я подозреваю, что GCC заставляет всю структуру быть выровненной по 32-битной границе, поэтому ее размер кратен 4.
Представьте себе следующее.
структура фу
{
пустота * бар;
некоторые другие вещи .....
};
struct foo my_foo_array [10];
Тогда, если sizeof (struct foo) не кратно 4, тогда.
my_foo_array [0] .bar имеет другое выравнивание памяти для my_foo_array [1] .bar. Процессору потребуется выполнить 2 32-битных доступа к памяти, чтобы получить доступ ко всем четырем байтам my_foo_array [1] .bar. Процессоры x86 выполнят эту повторную сборку неверно выровненных 32-битных значений, но большинство других процессоров вызовет некоторую форму исключения ошибки шины, что не является хорошим.
Атрибут упакован, указывает, как элементы структуры упакованы относительно друг друга, но при нормальной работе начало структуры должно быть размещено на 32-битном выровненном адресе.
Надеюсь, это немного лучше объясняет.