I am learning about how compilers represent C++ programs in assembly. I have a question about something that the compiler does that I can't make sense of. Here is some C++ code:
class Class1 {
public:
int i;
char ch;
};
int main() {
Class1 cls;
}
Compiling with "g++ -S " outputs this (I've stripped out everything but the function definition):
main:
push ebp
mov ebp, esp
sub esp, 16
mov eax, 0
leave
ret
I don't understand the line sub esp, 16
. Why would it allocate 16 bytes for an instance of this class that only requires 8 when you take into account data structure alignment and padding?
It should be
[int i - 4 bytes][char ch - 1 byte][padding - 3 bytes]
should it not?
When I compiled the code with the class definition also including a double, i.e.
class Class1 {
public:
int i;
char ch;
double dub;
};
it still allocated 16 bytes, which made sense in that case.
So why does the compiler allocate 16 bytes when it only needs 8?