处理无限递归创建的情况。在函数中,一个长字符串作为参数传递。当然这会导致堆栈溢出。我只是想知道如何堆栈行为递归调用参数。它是否只是将参数放入堆栈中进行递归?当使用参数进行递归调用时,堆栈中会发生什么?
-1
A
回答
1
不知道确切地说哪个编译器和哪个参数,很难说。
参数可以在堆栈中或寄存器中(但在下次调用之前,很可能寄存器需要在呼叫中保存)。其他东西也可以用尽堆栈空间。
大多数现代系统还会添加对齐以确保堆栈与X字节(通常为16或32)对齐,例如MS编译器也会在调试模式下添加额外的“检查外部变量覆盖”填充。
当然,函数调用将需要一个返回地址,虽然有些处理器可以将返回地址存储在一个寄存器中,但该寄存器将需要保存。可能还需要有一个“帧指针”来跟踪局部变量的位置,当然如果函数具有局部变量,那么这些变量也会在每次迭代时进入栈中。
如果代码足够复杂[这并不意味着特别复杂],编译器可能需要使用它必须通过堆栈保存和恢复的寄存器。另一个极端是,一些编译器会将“尾递归”改为一个简单的循环。
总之,很多因素都会影响到这一点,并且几乎无法确定在没有代码,编译器和编译器选项的情况下实际发生了什么。
0
我只是想知道如何堆栈的行为递归调用 参数。它是否只是将参数放入堆栈,每个 递归?
通常没有“行为”差异。
递归调用(带有一个或多个参数)在递归函数的未优化代码中的处理方式与具有相同参数的任何其他函数(或方法)调用相同。
在正确构建的尾递归中,我目睹了(并且可能找到一个例子),编译器可以在哪里优化掉调用/返回。参数push和jump和return被折叠为一个循环。
将高度优化的递归与高度优化的非递归代码进行比较可能具有挑战性。
相关问题
- 1. 没有递归函数调用会发生堆栈溢出吗?
- 2. 使用递归函数可能会发生堆栈溢出吗?
- 3. 什么是DRAM堆栈(递归期间发生了什么)?
- 4. 递归:使用堆栈
- 5. 当使用new操作符调用堆中的Class()时发生多个调用时会发生什么?
- 6. 使用C#和Mono进行堆栈溢出,递归函数
- 7. 在javascript中使用函数堆栈调用非递归方法
- 8. 当您使用负面参数调用glClearColor时会发生什么?
- 9. 使用递归创建二叉树时调用堆栈错误
- 10. 如果函数不返回,执行堆栈会发生什么?
- 11. 计划和调用堆栈递归
- 12. 递归调用堆栈深度
- 13. 合并排序递归调用堆栈
- 14. 堆栈缺少递归调用Java的
- 15. 什么时候会在函数调用堆栈中产生实际产量?
- 16. 为什么堆栈中总会有无用的函数参数?
- 17. 在调用calloc函数时切换参数会发生什么?
- 18. 当调用ajax调用时会发生什么?
- 19. 当您在堆栈中请求更多空间时会发生什么情况?
- 20. 当launchMode =“singleTask”时重新打开活动时,背堆栈会发生什么?
- 21. 使用递归溢出堆栈
- 22. 使用堆栈替换任意递归?
- 23. 当调用递归函数时发生IndexOutOfBoundsException
- 24. 当onPause被调用时数据会发生什么活动
- 25. java.lang.IllegalStateException:递归进入executePendingTransactions时,在setUserVisibleHint中调用时不会发生错误
- 26. 弹出堆栈时内存会发生什么变化?
- 27. 屏幕旋转时碎片返回堆栈会发生什么?
- 28. 递归Java - 堆栈
- 29. C++递归堆栈
- 30. 什么时候堆内存在一个进程中分开?执行系统调用会发生什么?
是的,它的确如此。它会把它放在哪里? – Barmar
递归调用和任何其他调用没有区别。所有参数通常都放在堆栈上。 – Barmar
堆栈帧只是更大,所以你可以更快地调试你的错误:) –