阵列存储发生了什么?

Mag*_*tus 4 c++ arrays

可能重复:
Stack中的动态数组?
编译器如何处理可变长度数组

我正在辅导的人编写了一些看起来像这样的代码,编译,运行正常,让我感觉像是一个完整的C++初学者:

int main(int argc, char** argv)
{
    int Index=0;
    cin>>Index;
    int Test_array[Index][Index];
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我找到了我的答案,为什么这在这里工作:关于C中的数组

但是,我仍然对如何进行审讯.

我的意思是,代码块的堆栈大小应该提前知道吗?所以肯定,Test_array不能存储在堆栈中......

编译器是否在后台执行new/malloc-delete/free操作以使用堆内存作为数组?

在这种情况下,如果在堆上找不到足够的内存,这样的代码会抛出bad_alloc异常吗?

Bla*_*iev 5

运行时唯一的区别是堆栈指针增加了一个变量偏移量,而不是一个常量.堆栈上的"分配"内存只不过是递增堆栈指针.编译器是否知道此值可能会影响某些优化,但肯定是可能的.

作为一个非常粗略的例子,区别在于:

add sp <sizeof(int) * 5>
Run Code Online (Sandbox Code Playgroud)

VS

add sp <sizeof(int) * nIndex>
Run Code Online (Sandbox Code Playgroud)

在引入VLA-s之前这样做的方法是使用该alloca功能.