C++ 无溢出的无限递归-可能吗?

C++ 无溢出的无限递归-可能吗?,c++,c,recursion,stack-overflow,calling-convention,C++,C,Recursion,Stack Overflow,Calling Convention,堆栈溢出的原因是堆栈空间耗尽,但如果函数没有参数,因此不需要将数据推送到堆栈上,该怎么办?这仍然会留下“返回”地址,但在预期无限递归的情况下,这是不必要的 所以我想问的是。。。是否可以使用某种调用约定,即调用不在堆栈上放置任何内容,只跳到第一条指令并执行,并且假设最后一条指令将是对函数的另一个调用,直到最终执行终止?理想情况下,这是否可以通过函数指针和动态链接实现 具体来说,我指的是一个函数,它只接受一个参数,不返回任何内容,所以从技术上讲,fastcall就足够了,但它仍然保留一个要返回的地址

堆栈溢出的原因是堆栈空间耗尽,但如果函数没有参数,因此不需要将数据推送到堆栈上,该怎么办?这仍然会留下“返回”地址,但在预期无限递归的情况下,这是不必要的

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

具体来说,我指的是一个函数,它只接受一个参数,不返回任何内容,所以从技术上讲,fastcall就足够了,但它仍然保留一个要返回的地址,这最终会导致溢出。这能以某种方式防止吗


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

是的,有两种递归函数。您正在寻找的类型是,它们相当于一个简单的循环。和通常使用实现,其中堆栈保持不变,函数永远不会通过堆栈返回


有些可能能够检测一些基本的递归函数,并将它们转换为循环构造而不是函数调用。但这只有在编译器能够识别正在发生的事情时才有效。所以答案可能是。基本上,如果程序员做了一些非常无效的事情,那么编译器可能会也可能不会提供帮助。因此,C++、代码、优化、重复的通常过程仍然存在。你需要的是C++/C目前不支持的(至少作为标准的一部分),我不认为有一种调用约定不会将任何内容放入堆栈。显示一组不同的调用约定,但最终都使用栈(一些使用寄存器第一)。为了澄清@ MGEZZ的注释,C和C++标准都不需要支持尾部调用,但是它们都允许,并且当前编译器能够实现它。如果不在堆栈上?@alk这将是实现它的一种方法,但很可能编译器只是将函数体更改为循环,而无需递归调用。实现尾部递归并不是很困难,很难检测到它适用的情况。1+,刚刚测试过,它似乎确实有效。:-)+感谢您提到“尾部调用优化”,因为它是每个函数式编程语言在教程中的答案和基本内容