我想知道在出现堆栈溢出异常之前,我们可以在 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);
}
我的问题是编译器如何决定抛出堆栈溢出异常
这是关于内存限制吗?
一旦我输入 42995,我就得到了 stackoverflow,但是这个数字不是恒定的,那么这是如何工作的呢?
每个线程都有一个堆栈大小。程序主线程的预定义堆栈大小在 exe 文件中是固定的。您进行的每次递归调用都会消耗该堆栈的一小部分。当你完成它时,CLR 会抛出一个StackOverflowException
。对于控制台/图形程序,默认堆栈大小应为 1mb 内存。您无法从程序内部使该内存“更大”(您可以使用编辑程序从程序“外部”更改它)。该内存不是动态的。它是固定的(从技术上讲,为该内存保留的地址空间是固定的,内存实际上是由 Windows 操作系统按需分配的,可能一次 4kb,但始终达到保留的地址空间)。您可以使用所需的堆栈大小创建辅助线程。
请注意,以这种方式处理堆栈是 x86/x64 架构的限制,http://en.wikipedia.org/wiki/Stack-based_memory_allocation http://en.wikipedia.org/wiki/Stack-based_memory_allocation:
某些处理器系列(例如 x86)具有用于操作当前执行线程的堆栈的特殊指令。其他处理器系列(包括 PowerPC 和 MIPS)没有显式堆栈支持,而是依赖约定并将堆栈管理委托给操作系统的应用程序二进制接口 (ABI)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)