我刚刚经过this Wikipedia entry。出于好奇心找到分配给一个简单过程的堆栈大小,我尝试了这个
int main()
{
static int count = 0;
cout<<" Count = "<<count++<<endl;
main();
return 0;
}
直到这一点,一切都很好,可以理解,从最后一位数字的方式,即43385我可以猜到最大堆栈大小 - 在32位机器上(如果我说4个字节(每个调用堆栈上的返回地址4个字节) ),我可能听起来很傻。
现在如果我将我的程序修改为: -
void foo()
{
static int count = 0;
cout<<" Count = "<<count++<<endl;
foo();
}
int main()
{
foo();
return 0;
}
在这个我得到Stack Over流量计数: - 130156(好的,好的)
但我的问题是,如果我在main和foo之间添加一个函数,我得到这个计数减1(130155),如果b / w foo中的2个函数和主计数减2(130154)等等。为什么会这样?是因为每个函数地址都消耗了1个空格。
答案 0 :(得分:1)
首先通过添加Count ++(愚蠢)来纠正您的程序。 堆栈大小不固定,大多数编译器允许您指定堆栈大小。堆栈大小还取决于某些因素,如平台,工具链,ulimit和其他参数。有许多静态和动态属性可以影响它。 有三种内存限制: 用于32位(窗口) 静态数据 - 2GB 动态数据 - 2GB 堆栈数据 - 1GB(堆栈大小由链接器设置,默认值为1MB。可以使用Linker属性System&gt; Stack Reserve Size来增加。)
通过使用您的程序,您可以猜测当前的堆栈大小。 memory-limits-applications-windows Stack Overflow Recursion in C c-maximum-stack-size-of-program会对您有所帮助。