2011-11-17 51 views
4

可能重复:
Dynamic array in Stack?
How do compilers treat variable length arrays数组存储发生了什么?

有人我辅导写了一些一段代码,看起来像这样,那编译,运行正常,让我觉得自己像一个完整的C++初学者:

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

N我发现我的答案,为什么这个在这里工作:about the array in C

但是,我仍然有关于如何审讯。

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

编译器是否在数组中使用堆内存来进行新的/ malloc-delete/free操作?

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

+3

这不是标准的C++。可变长度数组是一些编译器支持的扩展。 – aschepler

+0

之前被问过许多次。 –

+3

不是重复的:问题不是“这是否有效?”,而是“编译器如何做到这一点?” – aschepler

回答

5

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

作为一个非常粗略的例子不同的是:

add sp <sizeof(int) * 5> 

VS

add sp <sizeof(int) * nIndex> 

做到这一点的介绍VLA-S之前是与alloca功能的方式。