M.k*_*ary 4 c# stack-overflow callstack limits
我想知道在我们得到堆栈溢出异常之前我们可以在c#中执行多少调用
所以我决定写下面的代码
static void Method2(int Calls)
{
if(!Calls.Equals(0))
Method1(--Calls);//if more calls remain call method1 and reduce counter
}
static void Method1(int Calls)
{
if (!Calls.Equals(0))//if more calls remain call method2 and reduce counter
Method2(--Calls);
}
static void Main(string[] args)
{
var Calls= 42994;//number of calls(stack overflow appears for large number)
Method1(Calls);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是编译器如何决定抛出堆栈溢出异常是关于内存限制的?一旦我把42995我得到stackoverflow但这个数字不是恒定所以这是如何工作的?
每个线程都有一个堆栈大小.程序主线程的预定义堆栈大小在exe文件中修复.你做的每个递归调用,你消耗一点这个堆栈.完成后,CLR会抛出一个StackOverflowException.对于控制台/图形程序,默认堆栈大小应为1mb内存.你不能从程序内部"更大"这个内存(你可以使用editbin.exe从程序的"外部"改变它).这个记忆不是动态的.它是固定的(从技术上讲,为这个内存保留的地址空间是固定的,内存实际上是由Windows操作系统按需分配的,一次可能是4kb,但总是高达保留的地址空间).您可以使用所需的堆栈大小创建辅助线程.
请注意,以这种方式处理堆栈是x86/x64体系结构的限制,http://en.wikipedia.org/wiki/Stack-based_memory_allocation:
某些处理器系列(例如x86)具有用于操作当前正在执行的线程的堆栈的特殊指令.其他处理器系列(包括PowerPC和MIPS)没有显式的堆栈支持,而是依赖于约定并将堆栈管理委托给操作系统的应用程序二进制接口(ABI).
| 归档时间: |
|
| 查看次数: |
6449 次 |
| 最近记录: |