无溢出的无限递归 - 是否可能?

9 c c++ stack-overflow recursion calling-convention

堆栈溢出的原因是因为堆栈空间耗尽,但是如果函数没有参数,那么没有数据必须被压入堆栈呢?这仍然会推动"返回"地址,但在预期无限递归的情况下,这是不必要的.

所以我猜的是......是否有可能使用某种调用约定,调用不会在堆栈上放任何东西,只是跳转到第一条指令并执行并提供最终指令将是另一个函数调用,直到最终执行终止?理想情况下,如果可以使用函数指针和动态链接实现这一点?

只是为了指定,我指的是一个接受单个参数并且什么都不返回的函数,所以技术上fastcall就足够了,但它仍然保留了一个返回的地址,最终会导致溢出.这可以通过某种方式加以预防吗?

我之前没有提到的另一个重点,我不是指单个函数的递归,例如状态是静态的并且正在被重用,我的意思是从一个任意函数递归到另一个函数.

jbr*_*jbr 9

是的,有可能,有两种递归函数.您正在寻找的是原始递归函数,这些函数相当于一个简单的循环.并且通常使用尾递归来实现,其中堆栈保持不变,并且函数永远不会通过堆栈返回.

一些C++编译器可能能够检测一些原始递归函数,并将它们转换为循环结构而不是函数调用.但只有编译器能够识别正在发生的事情时,这才有效.所以答案可能就是这样.基本上,如果程序员做了非常无效的事情,那么编译器可能会或可能不会提供帮助.因此,"代码,配置文件,优化,重复"的常规过程仍然存在.