Компилятор (G++), похоже, выделяет больше памяти для экземпляров классов, чем ему нужно
Я изучаю, как компиляторы представляют программы 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, Когда вы принимаете во внимание выравнивание и заполнение структуры данных?
Он должен быть!--6-->
[int i - 4 bytes][char ch - 1 byte][padding - 3 bytes]
он не должен?
когда я скомпилировал код с определением класса, также включая double, т. е.
class Class1 {
public:
int i;
char ch;
double dub;
};
он по-прежнему выделял 16 байтов, что имело смысл в этом случае.
Итак, почему компилятор выделяет 16 байтов, когда ему нужно только 8?
1 ответов
Это связано с выравниванием стека, а не выравниванием структуры.
Если ты sizeof()
на ваших объектах вы увидите, что вы ожидаете с выравниванием структуры и заполнением.
однако Stack-frames немного отличаются. В большинстве систем сегодня выравнивание стека составляет 16 байт (или более) для размещения доступа к памяти SSE.