2015-11-13 43 views
-1

处理无限递归创建的情况。在函数中,一个长字符串作为参数传递。当然这会导致堆栈溢出。我只是想知道如何堆栈行为递归调用参数。它是否只是将参数放入堆栈中进行递归?当使用参数进行递归调用时,堆栈中会发生什么?

+1

是的,它的确如此。它会把它放在哪里? – Barmar

+0

递归调用和任何其他调用没有区别。所有参数通常都放在堆栈上。 – Barmar

+0

堆栈帧只是更大,所以你可以更快地调试你的错误:) –

回答

1

不知道确切地说哪个编译器和哪个参数,很难说。

参数可以在堆栈中或寄存器中(但在下次调用之前,很可能寄存器需要在呼叫中保存)。其他东西也可以用尽堆栈空间。

大多数现代系统还会添加对齐以确保堆栈与X字节(通常为16或32)对齐,例如MS编译器也会在调试模式下添加额外的“检查外部变量覆盖”填充。

当然,函数调用将需要一个返回地址,虽然有些处理器可以将返回地址存储在一个寄存器中,但该寄存器将需要保存。可能还需要有一个“帧指针”来跟踪局部变量的位置,当然如果函数具有局部变量,那么这些变量也会在每次迭代时进入栈中。

如果代码足够复杂[这并不意味着特别复杂],编译器可能需要使用它必须通过堆栈保存和恢复的寄存器。另一个极端是,一些编译器会将“尾递归”改为一个简单的循环。

总之,很多因素都会影响到这一点,并且几乎无法确定在没有代码,编译器和编译器选项的情况下实际发生了什么。

0

我只是想知道如何堆栈的行为递归调用 参数。它是否只是将参数放入堆栈,每个 递归?

通常没有“行为”差异。

递归调用(带有一个或多个参数)在递归函数的未优化代码中的处理方式与具有相同参数的任何其他函数(或方法)调用相同。

在正确构建的尾递归中,我目睹了(并且可能找到一个例子),编译器可以在哪里优化掉调用/返回。参数push和jump和return被折叠为一个循环。

将高度优化的递归与高度优化的非递归代码进行比较可能具有挑战性。

相关问题