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

5
我希望能够获得有关VC++(32位和64位)中堆栈溢出的准确信息,特别是在递归中。在调试模式下,递归很快就会发生这种情况(例如4500次运行简单递归函数不做任何事情之类的)。然而,发布模式似乎是不同的。由于优化删除不执行任何操作的代码(显然删除递归),因为我的代码或函数如此...我应该做更多的工作...我在优化后的发布版本中测量正确的时间,我不知道优化是否会对通过递归实现的更复杂的快速排序执行相同的操作。

谢谢!

4个回答

7

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

在VC++中,默认堆栈大小为1 MB,因此使用递归深度为10,000时,每个堆栈帧最多可以达到约100字节。

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

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

Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.


它运行成功了,谢谢!在配置后需要重新构建。 - user683595
在C/C++中,程序的最大堆栈大小是由操作系统决定的。在Windows上,默认情况下,堆栈大小为1MB。但是,可以使用SetThreadStackGuarantee函数来增加线程堆栈大小。在Linux上,堆栈大小通常为8MB,但可以通过ulimit命令进行更改。请注意,如果您的程序使用过多的堆栈空间,则可能会导致堆栈溢出错误。 - Pekka
1
我已经确保明确引用了你复制的初始措辞的答案。在将措辞从他人的内容中提取时,请务必在未来提供适当的归属。 - Brad Larson
@BradLarson:是的,先生。我明白您的意思了。我一定会记住的。谢谢! - Rahul Tripathi

1

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

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

0

你可以使用单独的堆栈将每个递归算法都变为迭代算法。


0

虽然增加堆栈不是一个可怕的想法,但堆栈空间并不是无限的,而且您可能已经注意到,堆栈用尽后很难恢复。如果您必须使用递归函数进行数千级别的递归,那么请增加堆栈。

为了安全起见,请确保测试最大安全递归级别,然后在您的函数中设置限制[即使在生产代码中,即使它会使其稍微慢一点并可能占用更多堆栈空间]。否则,可以肯定地说,某个人在某种方式下将使用您的代码,并在比您预期的递归深度更深的几个级别运行时崩溃- kablam,没有可能恢复。

另一个可能的解决方案是在单独的线程中运行递归,如果该线程崩溃,则仍然有主线程可以以某种明智的方式从崩溃中恢复(如果没有其他方法,只需记录您的代码崩溃的事实,以及那是什么情况)。

我肯定更喜欢具有非递归或至少有限递归级别,并使用其他机制,例如动态分配的LIFO数据结构来记录“我们在哪里”的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接