В моей настройке следующая структура занимает 16 байт:
Код: Выделить всё
struct MyExampleStruct
{
double d;
char b;
};
Из-за правила, согласно которому размер структуры округляется до минимального выравнивания ее наибольшего члена. Самый большой член имеет выравнивание 8, поэтому его размер округляется до 16. Если я добавлю целое число:
Код: Выделить всё
struct MyExampleStruct
{
double d;
char b;
int i;
};
Это все равно 16 байт. У char выравнивание 1 и так идет по адресу 8. У int выравнивание 4 и так идет по адресу 12, занимает четыре байта, результат 16 байт, все равно. Теперь о следующем:
Код: Выделить всё
struct ContainingStruct
{
MyExampleStruct f;
int i;
};
Теперь, по сути, я бы предпочел тот же макет, что и в предыдущем примере, однако, поскольку правила выравнивания и заполнения применяются одинаково, MyExampleStruct имеет размер 16, int идет по адресу 16, занимает 4 байта, это 20, однако правило заключается в том, что размер округляется до выравнивания наибольшего члена, поэтому размер ContainingStruct равен 24. Могу ли я сделать компилятор более эффективным здесь или нет?
Подробнее здесь:
https://stackoverflow.com/questions/791 ... ayout-here