Why is so much space allocated on the stack?

c++, compiler-construction

Solution

This extra space is generated by the /Zi compile option. Which enables Edit + Continue. The extra space is available for local variables that you might add when you edit code while debugging.

You are also seeing the effect of /RTC, it initializes all local variables to 0xcccccccc so that it is easier to diagnose problems due to forgetting to initialize variables. Of course none of this code is generated in the default Release configuration settings.

Problem

This question comes from answering Stack Overflow question Why do books say, “the compiler allocates space for variables in memory”?, where I tried to demonstrate to the OP what happens when you allocate a variable on the stack and how the compiler generates code that knows the size of memory to allocate. Apparently the compiler allocates much more space than what is needed. However, when compiling the following ``` #include <iostream> using namespace std; int main() { int foo; return 0; } ``` You get the following assembler output with Visual C++ 2012 compiled in debug mode with no optimisations on: ``` int main() { 00A31CC0 push ebp 00A31CC1 mov ebp,esp 00A31CC3 sub esp,0CCh // Allocates 204 bytes here. 00A31CC9 push ebx 00A31CCA push esi 00A31CCB push edi 00A31CCC lea edi,[ebp-0CCh] 00A31CD2 mov ecx,33h 00A31CD7 mov eax,0CCCCCCCCh 00A31CDC rep stos dword ptr es:[edi] int foo; return 0; 00A31CDE xor eax,eax } ``` Adding one more `int` to my program makes the commented line above to the following: ``` 00B81CC3 sub esp,0D8h // Allocate 216 bytes ``` The question raised by @JamesKanze in my answer linked atop, is why the compiler, and apparently it's not only Visual C++ (I haven't done the experiment with another compiler), allocated 204 and 216 bytes respectively, where in the first case it only needs four and in the second it needs only eight? This program creates a 32-bit executable. From a technical perspective, why may it need to allocate 204 bytes instead of just 4? EDIT: Calling two functions and creating a `double` and two `int` in main, you get ``` 01374493 sub esp,0E8h // 232 bytes ``` For the same program as the edit above, it does this in release mode (no optimizations): ``` sub esp, 8 // Two ints movsd QWORD PTR [esp], xmm0 // I suspect this is where my `double` goes ```

Original source

Related problems