堆栈溢出的原因是因为堆栈空间耗尽,但是如果函数没有参数,那么没有数据必须被压入堆栈呢?这仍然是推动"返回"地址,但在意图无限递归的情况下,这是不必要的。
所以我想问的是......是否可以使用某种调用约定,调用不会将任何东西放在堆栈上,只是跳转到第一条指令并执行并提供最后的指令是另一个函数调用,直到最终执行终止?理想情况下,如果可以使用函数指针和动态链接实现这一点吗?
只是为了指定,我指的是一个接受单个参数并且什么都不返回的函数,所以技术上fastcall就足够了,但它仍然保留了一个返回的地址,最终会导致溢出。这可以通过某种方式加以预防吗?
我之前未提及的另一个重点是,我并不是指单个函数的递归,例如状态是静态的并且正在被重用,我的意思是从一个任意函数递归到另一个函数。
答案 0 :(得分:9)
是的,有可能,有两种递归函数。你正在寻找的那种是primitive recursive functions,这些相当于一个简单的循环。并且通常使用tail recursion实现,其中堆栈保持不变,并且函数永远不会通过堆栈返回。
某些C++ compilers可能能够检测到一些原始递归函数,并将它们转换为循环结构而不是函数调用。但只有编译器能够识别正在发生的事情时,这才有效。所以答案可能就是这样。基本上,如果程序员做了非常无效的事情,那么编译器可能会或可能不会提供帮助。因此,“代码,配置文件,优化,重复”的常规过程仍然存在。