5

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

谢谢!

4

4 回答 4

7

正如 Andreas Brinck在他的相关回答中所说

在 VC++ 中,我认为默认堆栈大小为 1 MB,因此递归深度为 10.000 时,每个堆栈帧最多可以有 100 个字节。

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

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

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

于 2012-12-22T09:20:56.497 回答
1

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

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size.
于 2012-12-22T09:24:10.690 回答
0

虽然增加堆栈并不是一个糟糕的主意,但堆栈空间并不是无限的,而且您可能已经注意到,用完堆栈并不容易恢复。如果您必须使用递归数千级的递归函数,那么一定要增加堆栈。

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

另一种可能的解决方案是在单独的线程中运行递归,如果该线程崩溃,您仍然可以让您的主线程以某种理智的方式从崩溃中恢复(如果没有别的,只需记录您的代码崩溃的事实)堆栈失败,以及当时的情况)。

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

于 2012-12-22T12:13:14.387 回答
0

您可以迭代每个递归算法,例如使用单独的堆栈。

于 2012-12-22T09:22:31.420 回答