我试图声明一个 1024 x 1024 float 组,但弹出一个窗口说 project_name.exe 已停止工作...带有调试或关闭程序的选项。以前,我成功地声明了 1000 by 2 int 数组。我在互联网上搜索了可能的原因,他们说是与内存相关的问题,确切地说是“堆栈/堆溢出”。他们说 float 的情况更糟。
我只需要最多 5 或 6 位小数。
有什么意见或建议吗?我在 python 和 matlab 中都没有遇到这个问题。我正在使用 Microsoft Visual Studio 2010。
最佳答案
您是否将其声明为函数或方法中的局部变量?如果是这样,那就是典型的堆栈溢出。对于 VS2010,请参阅 http://msdn.microsoft.com/en-us/library/8cxs58a6%28v=vs.100%29.aspx
The reserve value specifies the total stack allocation in virtual memory. For x86 and x64 machines, the default stack size is 1 MB. On the Itanium chipset, the default size is 4 MB.
因此,一个 1024x1024 的 float 数组(假设每个 float 4 个字节)的时钟大小高达 4mb - 您已经突破了此处的默认堆栈限制。
请注意,即使您有 Itanium,您也无法使用所有这 4mb - 例如,参数也需要存储在堆栈中,请参阅http://www.csee.umbc.edu/~chang/cs313.s02/stack.shtml
现在,您可以只增加堆栈大小,但有一天您将需要使用更大的数组,所以这是一场您不会赢的消耗战。这个问题最好通过让它消失来解决;换句话说,而不是:
float stuff[1024 * 1024];
您将其声明为:
float *stuff = new float[1024 * 1024];
// do something interesting and useful with stuff
delete[] stuff;
现在分配在堆上,而不是在堆栈上。请注意,这不是 Robert Harvey 在他的回答中提到的那个堆;您在这里没有/HEAP 选项的限制。
关于c++ - 声明大型数组时堆栈/堆溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617794/