64 位调用约定是否会对递归算法的成本产生影响?



当我学习计算机科学时,有一些关于递归成本的讨论,因为函数调用开销,以及如何转换为更有效的东西。 例如,迭代、seehttp://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration?rq=1 或将自然递归算法转换为迭代算法:例如,自下而上而不是自上而下运行算法。

关于64位架构的一个有趣的事情是支持使用寄存器来回传递更多参数。引用阿格纳雾

使用寄存器将参数传输到函数和接收更有效 返回值比将这些值存储在堆栈上...在 64 位系统中,使用寄存器进行参数传输是标准化的。如果返回的对象适合为此目的分配的寄存器,则所有系统都使用寄存器作为返回值

这是否意味着我不需要太担心 64 位架构上递归函数调用的成本?

即使参数在寄存器中传递,该函数也需要在递归时在堆栈上保存一些状态。如果该状态中的任何一个是指针,则空间要求增加了一倍。这可能会使给定堆栈大小所能达到的最大递归深度减半。

在寄存器中传递参数不会更改算法的内存消耗属性,它仍然需要相同的堆栈空间。调用约定会修复用于每个位置参数的寄存器,显然不能使用相同的寄存器将不同的值传递到调用堆栈的更深处,因此编译器必须将其溢出到内存中。

最新更新