是否有一个调用堆栈等级限制?
题
我有几个同事看在Excel VBA中一些不好的代码,不知道是否有水平的调用栈
的数量限制解决方案
除非功能是尾递归和VBA可以处理(它不能),你会碰到一个堆栈溢出。
作为一个简单的测试,我被黑一起下面的代码片断:
Dim count As Integer
Sub Rec()
count = count + 1
Cells(1, 1) = count
Call Rec
End Sub
这告诉我们,这个极限是4007次迭代,至少在我的版本的Excel 2007此处。
的其他提示
简单的答案是肯定的,最终你会得到一个堆栈溢出异常。
不知道极限是什么,但。
我只是跑在Excel 2003中这个宏,并得到了深刻的4775个电话之前,我有错误28,“外出时的堆栈空间”:
Sub Macro1()
recurse (0)
End Sub
Sub recurse(level As Long)
ActiveCell.FormulaR1C1 = Str$(level)
Call recurse(level + 1)
End Sub
老问题,我知道,但我想这可能是有用的一些最新在这个问题,因为我是它今天在寻找信息。
在硬限制似乎是6801个呼叫深在Excel 2016 VBA_interested说,一个无参数的过程中,该数的参数的递归过程的数目减少了。
我跑了以下测试在Excel 2016:
子RecurseStatic(无参数)之后6801个递归溢出。结果 子Recurse1(1个参数)之后6442个递归溢出。点击 子RECURSE2(2个参数)之后6120,点击溢出
Option Explicit
Sub RecurseStatic()
Static i As Long
Debug.Print i
i = i + 1
RecurseStatic
End Sub
Sub RunRecurse1()
Recurse1 0
End Sub
Sub Recurse1(i As Long)
Debug.Print i
Recurse1 i + 1
End Sub
Sub RunRecurse2()
Recurse2 0, 0
End Sub
Sub Recurse2(i As Long, j As Long)
Debug.Print i, j
Recurse2 i + 1, j + 1
End Sub
我跑Anders的代码在Excel 2013,结果是只有1180不知道它们具有降低的递归限制在Excel的较新版本,或者如果问题是依赖于机器的或诸如此类的东西。
编辑:此外,改变了: ActiveCell.FormulaR1C1 =海峡$(水平) 至 范围( “A1”)。FormulaR1C1 =海峡$(电平)
和呼叫#降至807我也已经加入显式的选项。
<强>栈内存消耗。强>
据我所知堆栈如果用于参数来存储程序,以及用于在程序的本地变量。
因此将堆栈空间的消耗,正比于递归调用的次数。
因此堆栈的需要大小是这样的: 递归调用的编号*(呼叫参数为局部变量+空间的大小)