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