C++堆栈数组限制?

and*_*dge 2 c++ memory heap stack

我正在运行一些代码,可能指出我不太了解堆和堆栈之间的区别.下面我有一些示例代码,我要么在堆栈上声明一个数组,要么在1234567元素的堆上声明一个数组.两者都有效.

int main(int argc, char** argv){

  int N = 1234567;

  int A[N];

  //int* A = new int[N];

}
Run Code Online (Sandbox Code Playgroud)

但是如果我们将N设为12345678,我会得到一个带有int A [N]的seg错误,而堆声明仍然可以正常工作.(如果重要的话,我正在使用g ++ O3 -std = c ++ 0x).这有什么疯狂的?堆栈是否有(相当小的)数组大小限制?

eva*_*nal 6

这是因为堆栈的大小比堆小得多.堆可以占用程序可用的所有内存.默认情况下,VC++编译堆栈的大小为1 MB.堆栈提供更好的性能,但适用于较小数量的数据.通常,它不用于大型数据结构.这就是为什么在c ++中接受list/arrays/dictionaries/ect的函数通常会使用指针或对该结构的引用.通过值传递的参数被复制到堆栈上并且传递这样的结构将经常导致程序崩溃.

在你的例子中,你使用N int的是一个int4字节.这使得大小A[N]约为4.7 MB,远大于堆栈的大小.