Поскольку a
и c
не являются смежными, каждый из них резервирует пространство памяти полного int. Если вы перемещаете a
и c
вместе, размер структуры становится 8 байтами.
Кроме того, вы сообщаете компилятору, что хотите, чтобы a
занимал только 1 бит , а не 1 байт. Поэтому, хотя a
и c
рядом друг с другом должны занимать всего 3 бита (все еще под одним байтом), комбинация a
и c
по-прежнему выравнивается по словам в памяти на вашем 32-битном и, следовательно, занимая полные 4 байта в дополнение к int b
.
Аналогичным образом вы обнаружите, что
struct s{
unsigned int b;
short s1;
short s2;
};
занимает 8 байтов, а
struct s{
short s1;
unsigned int b;
short s2;
};
занимает 12 байтов, потому что в последнем случае два шорта каждый сидят в своем собственном 32-битном выравнивании.