Теперь у меня есть структура st, которая содержит другую структуру внутри:
struct st2 {
char b = 2;
long c = 3;
};
struct st {
char a = 1;
st2 mySt;
int d = 4;
char e = 5;
};
Когда я проверяю эту структуру st в памяти, она выглядит следующим образом:
0x7fffffffdce0: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdce8: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdcf0: 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdcf8: 0x04 0x00 0x00 0x00 0x05 0x00 0x00 0x00
Кажется что первый символ mySt выровнен по 8 (в x64 я думаю, что он использует размер struct st2, а #pragma pack по умолчанию равен 8).
Однако, если вы позволите мне разработать компилятор, я разберу mySt и рассмотрю каждый тип basi c mySt как st, поэтому между членами a и b не должно быть заполнения:
struct st {
char a = 1;
char b = 2; // unwind mySt
long c = 3; // unwind mySt
int d = 4;
char e = 5;
};
// Now the char a and b can storage in just one qword, by unwinding the sub structure.
0x7fffffffdcf0: 0x01 0x02 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdcf8: 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdd00: 0x04 0x00 0x00 0x00 0x05 0x00 0x00 0x00
Итак, вот вопрос: почему компилятор не выровнялся с типом basi c в каждой подструктуре, а выровнялся по размеру всей подструктуры? Разве это не пустая трата памяти?