相关疑难解决方法(0)

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

这个问题来自回答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)

c++ compiler-construction

62
推荐指数
1
解决办法
2381
查看次数

为什么C++函数可以创建可变长度的数组?

根据这个答案,其中指出:

编译器知道int类型的大小,因此可以生成正确的汇编程序指令,该指令将在堆栈上保留足够的空间,以便让foo存在.

编译器需要知道函数将在堆栈上占用的大小才能实现它.

那么,为什么这段代码会编译?

int f(int n)
{
    int x[n];
}

int main()
{
    f(3);
    f(5);
    //etc
}
Run Code Online (Sandbox Code Playgroud)

x 是一个整数数组,但它的大小不是常量,它可以在调用函数的任何时候改变.

我在这里错过了什么?

c++ memory arrays integer function

5
推荐指数
1
解决办法
196
查看次数

标签 统计

c++ ×2

arrays ×1

compiler-construction ×1

function ×1

integer ×1

memory ×1