Я изучаю, как компиляторы представляют программы C ++ на ассемблере. У меня есть вопрос о том, что делает компилятор, и я не могу понять его. Вот некоторый код C ++:
class Class1 {
public:
int i;
char ch;
};
int main() {
Class1 cls;
}
Компиляция с "g ++ -S" выводит это (я вырезал все, кроме определения функции):
main:
push ebp
mov ebp, esp
sub esp, 16
mov eax, 0
leave
ret
Я не понимаю строку sub esp, 16
. Зачем ему выделять 16 байтов для экземпляра этого класса, которому требуется только 8, если принять во внимание выравнивание структуры данных и заполнение ?
Должно быть
[int i - 4 bytes][char ch - 1 byte][padding - 3 bytes]
, не так ли?
Когда я компилировал код с определением класса, также включавшим двойное значение, то есть
class Class1 {
public:
int i;
char ch;
double dub;
};
, он все еще выделял 16 байт, что имело смысл в этом случае.
Так почему компилятор выделяет 16 байт, когда ему нужно только 8?