处理创建无限递归的情况。在函数中,长字符串作为参数传递。当然这会导致堆栈溢出。我只是想知道堆栈如何表现为带参数的递归调用。它是否只是在每次递归时将参数放入堆栈?
答案 0 :(得分:1)
如果不确切地了解哪个编译器和什么参数,很难肯定。
参数可以在堆栈上或寄存器中(但是在下一次调用之前,很可能寄存器需要在调用内保存)。其他东西也会耗尽堆栈空间。
大多数现代系统还会添加对齐以确保堆栈与X字节(通常为16或32)对齐,例如,MS Compiler也会在调试模式下添加额外的"检查是否覆盖在您的外部变量"填充。
当然,函数调用需要一个返回地址,虽然有些处理器可以将返回地址存储在寄存器中,但是需要保存该寄存器。可能还需要一个"帧指针"跟踪局部变量的位置,当然如果函数有局部变量,那么每次迭代也会进入堆栈。
如果代码足够复杂[并不一定意味着特别复杂],编译器可能需要使用它必须通过堆栈保存和恢复的寄存器。
另一方面,一些编译器将改变"尾部递归"一个简单的循环。
简而言之,很多因素都会影响到这一点,如果没有代码,编译器和编译器选项,几乎不可能确定实际发生的事情。
答案 1 :(得分:0)
我只是想知道堆栈如何表现为递归调用 参数。它是否只是将参数放入堆栈中 递归?
通常没有“行为”差异。
递归函数的未优化代码中的递归调用(带有一个或多个参数)的处理方式与使用相同参数的任何其他函数(或方法)调用相同。
在正确构造的尾递归中,我亲眼目睹了(并且可能找到一个例子)编译器可以优化掉调用/返回。参数push和jump and return将折叠为循环。
将高度优化的递归与高度优化的非递归代码进行比较可能具有挑战性。