你可以在堆栈上放多少数据?

时间:2013-07-25 13:15:05

标签: c++ visual-c++

我尝试在堆栈上创建一个~975KB的数组,然后崩溃了。

const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash

这似乎是一个非常小的空间。在初始化变量之前,有没有办法知道有多少空间可用(总数和当前空间)?

3 个答案:

答案 0 :(得分:6)

几乎所有系统都限制堆栈。允许的大小取决于OS /编译器组合。将大量数据放在堆栈上是一个糟糕的主意。使用C ++标准类型(例如vector)或使用您自己的动态内存分配。你永远不知道什么时候其他一些函数会增加一些额外的堆栈,而且突然之间,你超越了极限 - 最好不要达到堆栈最大值附近的任何地方。

答案 1 :(得分:3)

在Visual C ++中,默认堆栈大小由链接器选项/STACK (doc)管理。默认情况下,它是1 MB。

请注意,每个新线程都有自己的堆栈,您可以在函数dwStackSize中使用参数CreateThread指定初始大小。如果为0,则默认为链接器命令中使用的那个。

关于您的其他问题,无法查询当前/最大堆栈大小。为避免出现问题,最好将堆用于任何重要的内存分配。

答案 2 :(得分:3)

Visual Studio的默认堆栈大小为1MB,因为Andre说您可以使用std::vector来避免此问题,或者您可以动态分配内存。您可以使用/F在Visual Studio上调整堆栈大小。如果没有令人信服的理由在堆栈上分配数据,那么使用其他选项可能更有意义。