伪码:
void 0001() { 0002(); }
void 0002() { 0003(); }
void 0003() { 0004(); }
... 一直喊 ...
void N-1() { N (); }
void N() { 再喊下去就出问题了 }
这个N 值总不可能没有限制,最多是多少?
是固定值,还是与硬件有关?
void 0001() { 0002(); }
void 0002() { 0003(); }
void 0003() { 0004(); }
... 一直喊 ...
void N-1() { N (); }
void N() { 再喊下去就出问题了 }
这个N 值总不可能没有限制,最多是多少?
是固定值,还是与硬件有关?
call指令本身会push esp,ebx等寄存器值到栈上,栈是有限的,push就不能无限。
每次函数执行都涉及压栈(调用)和出栈(返回),压栈压的是参数和返回地址,反之亦然。在函数调用未返回的情况下,就要持续占用栈空间,所以能嵌套多少层要看线程栈的大小。持续压栈而不出栈,就会造成线程栈溢出,一般编程中遇到的stack overflow错误就这个意思。线程栈在未特殊设置时有默认值,开发者也可在stack allocation中自定义设置。
我刚试了。 试验环境VC6.0哈。
试验代码如下://传一个参数
#include <iostream.h>
#include <fstream.h>ofstream outFile("test.txt");
void Func(unsigned int a/*, unsigned int b, unsigned int c*/)
{
outFile<<a<<endl;
a++;
Func(a/*,a,a*/);
}int main()
{
unsigned a=0;
Func(a/*,a,a*/);
return 0;
}发现test.txt的最终值为11754
//传入两个参数
#include <iostream.h>
#include <fstream.h>ofstream outFile("test.txt");
void Func(unsigned int a, unsigned int b/*, unsigned int c*/)
{
outFile<<a<<endl;
a++;
Func(a,a,/*a*/);
}int main()
{
unsigned a=0;
Func(a,a/*,a*/);
return 0;
}发现test.txt的最终值为11243这样你就可以计算编译器为该程序分配的栈啦。
设入栈字节数为:函数传入字节+X(保存现场的其他字节,如指令指针等)
设该程序的栈大小为Y字节。
解二元一次方程: (4+X)*11754=Y; (8+X)*11243=Y;
解得:X=84; Y=1034352;现在你就可以猜猜传入3个参数的时test.txt的最终值应为10774由此可见递归次数(就是你说的“喊”的次数)与程序的栈大小有关。
VC 6.0编译器默认为应用程序分配1MB的栈空间。
-----------------------------------------------
VC6可更改栈大小
Project->Setting->Link,在Category 中选中Output,在Reserve中设定堆栈的最大值和commit;linux 方便些,好象可设1G。