为什么这个递归方法在没有变量的情况下会导致堆栈溢出错误



我有这样的递归方法,它不包含任何变量。为什么它抛出堆栈溢出异常?

class MainClass
{
static void Main() => Bark();
static void Bark() { Bark(); }
}

在上面的例子中,我没有创建任何变量。如果我创建任何变量(作为参数或在方法内部(,那么这是可以理解的:许多变量已经在线程的堆栈中创建,由于内存不足,我会出错。

我不明白,方法本身是否也存储在堆栈上?为什么我会出错?

堆栈帧不仅包含参数,还包含返回地址,以便处理器知道返回到哪里。

此外,隐藏的this指针也是一个参数。要删除它,您需要一个static函数。

还有ebp或其他堆栈帧指针,根据确切的调用约定,可以为每次调用将其推送到堆栈上。

因此,无论您做什么,都肯定会在某个时刻出现堆栈溢出,除非编译器决定执行尾部递归。

如果您要调试这段代码;调用堆栈";窗口中,您会看到它尝试将Bark无限次添加到调用堆栈中,因为递归并没有终点。

我相信您期望看到的是尾部递归。遗憾的是,C#编译器不支持它。

相关内容

最新更新