function sum(i)
{
if (i == 1) return 1
return i + sum(i - 1)
}
显然,这是一个递归函数,函数自己调用自己。
那么每个调用,都必须保存一个i的变量。
此时就要用堆栈。堆栈的栈顶始终保持着函数的局部变量。当函数返回,则往回收缩,这多方便。
而堆呢?适合全局的、一般的存储。
递归最容易导致的问题就是堆栈溢出了,一般来说操作系统给一个进程划分的栈内存是2M(好像是),按照正常的程序处理,局部变量进栈出栈,栈不太可能会溢出,但是递归会导致不会出栈,这就有可能导致堆栈溢出,你这里定义两个int型变量,即8字节,再加上保存的函数地址等信息,*100000次递归,还有一些其他的入栈的局部变量,可能已经超出了最大的栈空间,所以溢出。栈是线程的,不是进程的是一个进程一个堆,一个线程一个栈吗
堆≈虚拟内存大小-1GB
栈通常为4MB
下面是一些说明文件:
Visual C++ 编译器选项
/F(设置堆栈大小)
请参见 发送反馈意见
设置程序堆栈大小(以字节为单位)。
/F[ ]number
参数
number
堆栈大小(以字节为单位)。
备注
如果不使用此选项,堆栈大小默认为 1 MB。number 参数可以用十进制或 C 语言表示法表示。参数的范围可以在 1 到链接器接受的最大堆栈大小之间。链接器将指定值向上舍入为最接近的 4 个字节。/F 和 number 之间的空格可选的。