VC ++中的堆栈大小是多少?

时间:2012-12-22 09:15:53

标签: c recursion stack callstack visual-c++

我想要有关VC ++(32位和64位)中堆栈溢出的准确信息,特别是递归。在调试模式下,这种情况很快发生在递归中(如4500运行简单的递归函数不做任何事情或类似)。但是,似乎发布模式不同。这很难理解,我现在没有测试它,因为优化会删除不做任何事情的代码(显然会删除递归),因为我的代码或函数是这样的......我应该做更多...我测量在优化版本中的正确时间,我不知道优化是否会通过递归实现更复杂的快速排序?

谢谢!

4 个答案:

答案 0 :(得分:7)

作为Andreas Brinck states in his related answer

  

在VC ++中我认为默认的堆栈大小是1 MB,所以使用递归   每个堆栈帧的深度为10.000,最多约为100个字节。

可以使用以下方法修改此堆栈大小限制:

项目→属性→配置属性→链接器→系统→堆栈预留大小。

<强> Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.

答案 1 :(得分:1)

VC ++中堆栈大小的选项位于,

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size.

答案 2 :(得分:0)

你可以做每个递归算法迭代,例如单独堆叠。

答案 3 :(得分:0)

虽然增加堆栈并不是一个糟糕的想法,但堆栈空间并不是无限的,正如您可能已经注意到的那样,堆栈的耗尽并不容易恢复。如果你必须使用递归几千个级别的递归函数,那么一定要增加堆栈。

为了安全起见,请确保测试最大安全递归级别,然后对函数进行限制[即使在生产代码中,即使它使得它稍微慢一点并且可能占用更多的堆栈空间]。否则,你可以打赌,某个地方的某个人会以你没有预料到的方式使用你的代码,并且当它比你预期的更深入到递归时会发生崩溃 - kablam,没有可能的恢复。

另一个可能的解决方案是在一个单独的线程中运行你的递归,如果那个线程崩溃,你仍然有你的主线程以一些理智的方式从崩溃中恢复(如果没有别的,只是记录你的代码的事实崩溃与堆栈失败,以及那是什么情况)。

我当然希望有一个非递归或至少有限的递归级别,并使用其他机制,例如动态分配的lifo数据结构来记录“我们在哪里”。