栈溢出的原因是栈空间用完了,但是如果函数没有参数,没有数据压栈呢?这仍然留下插入“返回”地址,但在预期无限递归的情况下,这是不必要的。
所以我想问的是......是否可以使用某种调用约定,调用不会在堆栈上放置任何内容,只是跳转到第一条指令并执行,前提是最终指令将是对函数的另一个调用,直到最终执行终止?理想情况下,是否可以使用函数指针和动态链接来实现?
只是说明一下,我指的是一个接受单个参数且不返回任何内容的函数,因此从技术上讲 fastcall 就足够了,但它仍然保留了一个要返回的地址,这最终会导致溢出。可以通过某种方式避免这种情况吗?
另一个我之前没有提到的重点,我不是指单个函数的递归,例如在状态是静态的并且被重用的情况下,我的意思是从一个任意函数递归到另一个函数。
最佳答案
是的,有两种递归函数。您要找的是primitive recursive functions ,这些相当于一个简单的循环。通常用 tail recursion 实现,其中堆栈保持不变,函数永远不会通过堆栈返回。
一些 C++ compilers可能能够检测到一些原始递归函数,并将它们转换为循环构造而不是函数调用。但这仅在编译器能够识别正在发生的事情时才有效。所以答案可能是。基本上,如果程序员做了一些非常无效的事情,那么编译器可能会或可能不会提供帮助。因此,“编码、配置文件、优化、重复”的通常过程仍然存在。
关于c++ - 没有溢出的无限递归 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423836/