我刚才做了一个测试:
function overflow(stack:int = 0):void
{
if(stack < 5290)
{
trace(stack);
overflow(stack + 1);
}
}
overflow();
Run Code Online (Sandbox Code Playgroud)
这总是在5287调用后抛出StackOverflow错误.
错误#1023:发生堆栈溢出.
这个限制是变量(取决于机器规格,环境等)还是在某处定义的平坦值?如果我将if语句更改为小于5287,我不会收到错误.
显然它是可变的。由于您真正执行的所有计算都位于堆栈中(反汇编报告代码显示pushbyte指令和其他与堆栈一起使用的内容,如非操作数算术),因此该值仅报告可以将多少个函数上下文放入堆栈中,直到堆栈溢出。
我决定根据巴里斯评论中引用的这篇文章来运行一些递归阈值测试。结果相当尴尬。测试环境:FlashDevelop 3.3.4 RTM,Flash播放器调试器10.1.53.64,flash编译模式:release。“调试”模式基本上没有改变数字,也检查了这一点。
Locals number Iterations (static int) Iterations (Math.random())
0 5306
1 4864 4856
2 4850 4471
3 4474 4149
4 4153 3870
5 3871 3868
6 3869 3621
7 3620 3404
8 3403 3217
9 3210 3214
10 3214 3042
11 3042 3045
10 mixed 3042 1 value was assigned Math.random() and 9 - static int
10 advancedRandom 2890 1 value was assigned a custom random with 1 parameter
Run Code Online (Sandbox Code Playgroud)
请注意,所有这些值在后续执行之间的变化幅度都在 10 以内。“static int”和“Math.random()”是分配给递归调用函数中的局部变量的名称。然而,这使我做出以下假设: