VC++中栈的大小是多少?
Posted
技术标签:
【中文标题】VC++中栈的大小是多少?【英文标题】:what is the size of stack in VC++? 【发布时间】:2012-12-09 17:01:57 【问题描述】:我想要有关 VC++(32 位和 64 位)中堆栈溢出的准确信息,尤其是递归。在调试模式下,这种情况在递归中很快发生(就像 4500 运行一个简单的递归函数不做任何事情或类似的事情)。但是,似乎发布模式有所不同。很难理解,我现在还没有测试它,因为优化删除了不做任何事情的代码(显然删除了递归),因为我的代码或函数是如此..我应该做更多..我测量优化发布的合适时机,不知道在递归实现的更复杂的快速排序中优化是否也一样?
谢谢!
【问题讨论】:
【参考方案1】:作为 Andreas Brinck states in his related answer:
在 VC++ 中,我认为默认堆栈大小为 1 MB,因此使用递归 每个堆栈帧的深度为 10.000,最多可达 ~100 个字节。
可以使用以下方法修改此堆栈大小限制:
项目 → 属性 → 配置属性 → 链接器 → 系统 → 堆栈保留大小。
【讨论】:
成功了,谢谢,配置后需要重建。谢谢! 不客气!!不要忘记接受答案。圣诞快乐! 第一段从C/C++ maximum stack size of program逐字复制 我已确保明确引用您复制初始措辞的答案。请确保在将来从其他人的内容中提取措辞时提供适当的署名。 @BradLarson:- 是的,先生。我明白你的意思了。我一定会牢牢记住这一点。谢谢!!【参考方案2】:VC++中栈大小的选项位于,
Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size.
【讨论】:
【参考方案3】:您可以迭代每个递归算法,例如有一个单独的堆栈。
【讨论】:
【参考方案4】:虽然增加堆栈并不是一个糟糕的主意,但堆栈空间并不是无限的,而且您可能已经注意到,用完堆栈并不容易恢复。如果您必须使用递归数千级的递归函数,那么一定要增加堆栈。
为了安全起见,请确保您确实测试了最大安全递归级别,然后在您的函数中设置一个限制 [即使在生产代码中,即使它会让它变慢一点并且可能占用更多堆栈空间]。否则,你可以打赌,某个地方的某个人会以你没有预料到的方式使用你的代码,并且当它运行到比你预期的更深的递归级别时会崩溃——kablam,不可能恢复。
另一种可能的解决方案是在单独的线程中运行递归,如果该线程崩溃,您仍然可以以某种理智的方式从崩溃中恢复主线程(如果没有别的,只需记录您的代码因堆栈失败而崩溃,以及当时的情况如何)。
我当然更喜欢有一个非递归的,或者至少是有限的递归级别,并使用其他机制,例如动态分配的 lifo 数据结构来记录“我们在哪里”。
【讨论】:
以上是关于VC++中栈的大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章