c++ - 没有溢出的无限递归 - 这可能吗?

标签 c++ c recursion stack-overflow calling-convention

栈溢出的原因是栈空间用完了,但是如果函数没有参数,没有数据压栈呢?这仍然留下插入“返回”地址,但在预期无限递归的情况下,这是不必要的。

所以我想问的是......是否可以使用某种调用约定,调用不会在堆栈上放置任何内容,只是跳转到第一条指令并执行,前提是最终指令将是对函数的另一个调用,直到最终执行终止?理想情况下,是否可以使用函数指针和动态链接来实现?

只是说明一下,我指的是一个接受单个参数且不返回任何内容的函数,因此从技术上讲 fastcall 就足够了,但它仍然保留了一个要返回的地址,这最终会导致溢出。可以通过某种方式避免这种情况吗?

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

最佳答案

是的,有两种递归函数。您要找的是primitive recursive functions ,这些相当于一个简单的循环。通常用 tail recursion 实现,其中堆栈保持不变,函数永远不会通过堆栈返回。

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

关于c++ - 没有溢出的无限递归 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423836/

相关文章:

c - TCP 死链检测

javascript - 普通 JavaScript 中的滚动动画仅适用于导航链接

c++ - 转换递归函数并使其迭代

c++ - 字长是否限制内存地址的数量,而不是内存本身?

c - opengl:关于 glutMainLoop() 的问题

C++ '>' 按位运算符

C select总是检测到套接字可读

javascript - 无法识别触发 "maximum call stack size exceeded"错误的递归

c++ - 在运行时从没有虚函数的基类方法访问派生类方法

c++ - 在类内部引入的类名不被视为嵌套类名