我想要有关VC ++(32位和64位)中堆栈溢出的准确信息,特别是递归。在调试模式下,这种情况很快发生在递归中(如4500运行简单的递归函数不做任何事情或类似)。但是,似乎发布模式不同。这很难理解,我现在没有测试它,因为优化会删除不做任何事情的代码(显然会删除递归),因为我的代码或函数是这样的......我应该做更多...我测量在优化版本中的正确时间,我不知道优化是否会通过递归实现更复杂的快速排序?
谢谢!
答案 0 :(得分:7)
作为Andreas Brinck states in his related answer:
在VC ++中我认为默认的堆栈大小是1 MB,所以使用递归 每个堆栈帧的深度为10.000,最多约为100个字节。
可以使用以下方法修改此堆栈大小限制:
项目→属性→配置属性→链接器→系统→堆栈预留大小。
<强> 强>
答案 1 :(得分:1)
VC ++中堆栈大小的选项位于,
Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size.
答案 2 :(得分:0)
你可以做每个递归算法迭代,例如单独堆叠。
答案 3 :(得分:0)
虽然增加堆栈并不是一个糟糕的想法,但堆栈空间并不是无限的,正如您可能已经注意到的那样,堆栈的耗尽并不容易恢复。如果你必须使用递归几千个级别的递归函数,那么一定要增加堆栈。
为了安全起见,请确保测试最大安全递归级别,然后对函数进行限制[即使在生产代码中,即使它使得它稍微慢一点并且可能占用更多的堆栈空间]。否则,你可以打赌,某个地方的某个人会以你没有预料到的方式使用你的代码,并且当它比你预期的更深入到递归时会发生崩溃 - kablam,没有可能的恢复。
另一个可能的解决方案是在一个单独的线程中运行你的递归,如果那个线程崩溃,你仍然有你的主线程以一些理智的方式从崩溃中恢复(如果没有别的,只是记录你的代码的事实崩溃与堆栈失败,以及那是什么情况)。
我当然希望有一个非递归或至少有限的递归级别,并使用其他机制,例如动态分配的lifo数据结构来记录“我们在哪里”。