Я не знаю, откуда вы взяли, что char
или int
рассчитывается как "8 байтов". Нет, каждый тип рассчитывается в соответствии с его размером: char
как 1, int
как 4 на 32-битной платформе (не 8, а 4). Требование выравнивания для каждого типа обычно совпадает с его размером (хотя это не обязательно).
По этой причине, когда структура содержит элементы того же типа , общий размер этой структуры обычно будет точной суммой размеров ее элементов: структура 3 char
s будет иметь размер 3, а структура из двух int
s будет иметь размер 8.
Видимо, на вашей платформе тип short
имеет размер 2, поэтому, как ожидается, структура из 3 шорт имеет размер 6, что вы и наблюдаете.
Однако, когда ваша структура содержит элементы разных типов, тогда вступает в силу разница между требованиями к выравниванию разных типов. Если требование выравнивания следующего поля является более строгим, чем требование выравнивания предыдущего поля, компилятору, возможно, придется добавить несколько байтов заполнения между этими полями (чтобы правильно выровнять следующий элемент), что повлияет на окончательный размер структуры. Кроме того, компилятору, возможно, придется добавить несколько дополнительных байтов заполнения после последнего члена структуры, чтобы удовлетворить требования выравнивания в массиве.
Например, структура, которая выглядит следующим образом
struct S {
char c;
int i;
};
, скорее всего, будет занимать 8 байт на вашей платформе из-за необходимости 3 байта заполнения после члена char
. Обратите внимание, что char
считается как 1, int
как 4, и дополнительные 3 байта заполнения между ними делают его 8.
Также обратите внимание, что это может легко привести к зависимости окончательного размера структуры от порядка, в котором члены объявлены. Например, эта структура
struct S1 {
char c1;
int i;
char c2;
};
на вашей платформе, вероятно, будет иметь размер 12, тогда как этот
struct S2 {
int i;
char c1;
char c2;
};
будет занимать всего 8 байтов. Этот последний пример предназначен для иллюстрации того, что окончательный размер структуры не может быть выражен с точки зрения количества байтов, на которые «рассчитывает» каждый элемент. Отношения между членами также важны.