Performance 64位调用约定对递归算法的成本有影响吗

Performance 64位调用约定对递归算法的成本有影响吗,performance,recursion,64-bit,Performance,Recursion,64 Bit,当我被教计算机科学时,有人讨论递归的代价,因为函数调用的开销,以及如何转换成更有效的东西。例如,迭代,seehttp://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration?rq=1,或将自然递归算法转换为迭代算法:例如,自下而上而不是自上而下运行算法 64位体系结构的一个有趣之处是支持使用寄存器来回传递更多参数。到 使用寄存器将参数传输到函数和接收参数更有效 返回值比将这些值存储在堆栈上。。。在64位

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

64位体系结构的一个有趣之处是支持使用寄存器来回传递更多参数。到

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


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

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

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

您可以少担心一点。这不是万能药。64位程序需要更多堆栈内存的原因-@AndreyCpp v有趣的文章(适用于所有函数,而不仅仅是递归函数)谢谢你。如果我理解正确,你是说,例如,如果我们有
f(x,y)
递归调用
f(g(x),h(y))
f(g'(x),h'(y))
,然后我们不能使用寄存器P和Q作为参数
x
y
,因为如果我们这样做,并且第一次调用
f
,而不溢出
x
/
y
g'(x)
/
h'(y)
到内存,我们将无法进行第二次调用
f
。这是一个很好的观点!然而,我不确定这是否意味着递归参数永远不能在寄存器中。例如,
f(x,y,c,k)
,其中
c
k
是常数。我认为
c
k
可以在寄存器中,这是对的吗?