Ton*_*ion 62 c++ compiler-construction
这个问题来自回答Stack Overflow问题为什么书籍会说"编译器为内存中的变量分配空间"?,我试图向OP演示当你在堆栈上分配一个变量时会发生什么,以及编译器如何生成知道要分配的内存大小的代码.显然,编译器分配的空间比需要的多得多.
但是,在编译以下内容时
#include <iostream>
using namespace std;
int main()
{
int foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调试模式下编译的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
}
Run Code Online (Sandbox Code Playgroud)
在int我的程序中再添加一个,使上面的注释行显示如下:
00B81CC3 sub esp,0D8h // Allocate 216 bytes
Run Code Online (Sandbox Code Playgroud)
@JamesKanze在我的回答链接上提出的问题是为什么编译器,显然它不仅是Visual C++(我没有用另一个编译器做过实验),分别分配了204和216个字节,在第一种情况下它只需要四个,而在第二个只需要八个?
该程序创建一个32位可执行文件.
从技术角度来看,为什么需要分配204个字节而不是4个?
编辑:
你可以调用两个函数并在main中创建一个double和两个函数int
01374493 sub esp,0E8h // 232 bytes
Run Code Online (Sandbox Code Playgroud)
对于与上面编辑相同的程序,它在发布模式下执行此操作(无优化):
sub esp, 8 // Two ints
movsd QWORD PTR [esp], xmm0 // I suspect this is where my `double` goes
Run Code Online (Sandbox Code Playgroud)
Han*_*ant 102
这个额外的空间由/ Zi编译选项生成.这使Edit + Continue成为可能.额外的空间可用于在调试时编辑代码时可能添加的局部变量.
您还看到/ RTC的效果,它将所有局部变量初始化为0xcccccccc,以便更容易诊断由于忘记初始化变量而导致的问题.当然,这些代码都不会在默认的Release配置设置中生成.
| 归档时间: |
|
| 查看次数: |
2381 次 |
| 最近记录: |