Компилятор (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, если принять во внимание выравнивание структуры данных и заполнение ?

Должно быть

[int i - 4 bytes][char ch - 1 byte][padding - 3 bytes]

, не так ли?

Когда я компилировал код с определением класса, также включавшим двойное значение, то есть

class Class1 {
public:
  int i;
  char ch;
  double dub;
}; 

, он все еще выделял 16 байт, что имело смысл в этом случае.

Так почему компилятор выделяет 16 байт, когда ему нужно только 8?

10
задан Grady S 8 November 2011 в 04:47
поделиться