hex*_*ist 6

我不能谈论不同的编译器/解释器的确切实现细节,但一般来说尾部调用优化的操作如下:

通常,函数调用涉及以下内容:

  1. 为返回分配堆栈空间
  2. 将当前指令指针推入堆栈
  3. 为函数参数分配堆栈空间并适当设置它们
  4. 打电话给你的功能
  5. 要返回它,它会适当地设置它的返回空间,弹出它应该返回的指令指针并跳转到它

但是当一个函数处于尾部位置时,这意味着你要返回你要调用的函数的结果,你可能会很棘手并且做

  1. 重新使用为您自己的返回值分配的堆栈空间,作为为您要调用的函数的返回值分配的堆栈空间
  2. 重新使用您应该返回的指令指针作为您要调用的函数将使用的指令指针
  3. 释放自己的参数堆栈空间
  4. 为参数分配空间并进行适当设置
  5. 设置参数的值
  6. 打电话给你的功能
  7. 返回时,它将直接返回给您的调用者.

请注意,#1和#2实际上并不涉及任何工作,#3可能很棘手或简单,具体取决于您的实现,4-7不涉及您正在调用的函数中的任何特殊内容.还要注意,所有这些都会导致相对于调用堆栈的0堆栈增长,因此这允许infinte递归并且通常会加快一些速度.

还要注意,这种优化不仅可以应用于直接递归函数,还可以应用于共同递归函数,实际上也可以应用于尾部位置的所有调用.