Компилятор (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.