为什么在堆栈上分配这么多空间?

这个问题来自回答Stack Overflow问题为什么书上说“编译器为内存中的variables分配空间”? ,我试图向OP演示在堆栈中分配variables时会发生什么,以及编译器如何生成知道要分配的内存大小的代码。 显然,编译器分配的空间比需要的多得多。

但是,在编译以下时

#include <iostream> using namespace std; int main() { int foo; return 0; } 

使用debugging模式编译的Visual C ++ 2012,您可以获得以下汇编程序输出,不会优化:

 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 } 

在我的程序中添加一个int使得上面的注释行如下所示:

 00B81CC3 sub esp,0D8h // Allocate 216 bytes 

@JamesKanze在我的回答中提到的问题是,为什么编译器,显然它不仅是Visual C ++(我还没有用另一个编译器做实验),分别分配了204和216字节,在第一种情况下只需要四个,在第二个只需要八个?

该程序创build一个32位可执行文件。

从技术angular度来看,为什么需要分配204个字节而不是4个?

编辑:

调用两个函数并在main中创build一个double和两个int ,就可以得到

  01374493 sub esp,0E8h // 232 bytes 

对于与上面的编辑相同的程序,它在发布模式下执行此操作(不进行优化):

  sub esp, 8 // Two ints movsd QWORD PTR [esp], xmm0 // I suspect this is where my `double` goes 

这个额外的空间是由/ Zi编译选项生成的。 这使编辑+继续。 额外的空间可用于在debugging时编辑代码时可能添加的局部variables。

你也看到了/ RTC的效果,它将所有局部variables初始化为0xcccccccc,这样就可以更容易地诊断由于忘记初始化variables而导致的问题。 当然,这些代码在默认的发布configuration设置中都不会生成。