C#中的调用堆栈限制

参见英文答案 > Stack capacity in C#                                    5个
我想知道在我们得到堆栈溢出异常之前我们可以在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我得到*但这个数字不是恒定所以这是如何工作的?

解决方法:

每个线程都有一个堆栈大小.程序主线程的预定义堆栈大小在exe文件中修复.你做的每个递归调用,你消耗一点这个堆栈.完成后,CLR抛出*Exception.对于控制台/图形程序,默认堆栈大小应为1mb内存.你不能从程序内部“更大”这个内存(你可以使用editbin.exe从程序的“外部”改变它).这个记忆不是动态的.它是固定的(从技术上讲,为这个内存保留的地址空间是固定的,内存实际上是由Windows操作系统按需分配的,一次可能是4kb,但总是高达保留的地址空间).您可以使用所需的堆栈大小创建辅助线程.

请注意,以这种方式处理堆栈是x86 / x64体系结构的限制,http://en.wikipedia.org/wiki/Stack-based_memory_allocation

Some processors families, such as the x86, have special instructions for manipulating the stack of the currently executing thread. Other processor families, including PowerPC and MIPS, do not have explicit stack support, but instead rely on convention and delegate stack management to the operating system’s application binary interface (ABI).

上一篇:c – backtrace_symbols无法打印导致信号的函数


下一篇:c – 有没有办法在gdb中设置一个以调用堆栈为条件的断点?