为什么允许递归使 C 在 8 位 CPU 上变慢/效率低下

Kin*_*ley 2 c recursion 8-bit

关于8 位 CPU 的编译器效率问题的答案似乎暗示允许递归会使 C 语言在这些体系结构上效率低下。我不明白递归函数调用(同一函数的)与各种函数的重复函数调用有何不同。

我想了解为什么会这样(或者为什么看似博学的人认为是这样)。我可以猜测,也许这些架构只是没有堆栈空间,或者推送/弹出效率低下 - 但这些只是猜测。

use*_*198 6

因为要有效地实现 C 堆栈,您需要能够有效地加载和存储到当前帧内的任意偏移量。例如,8086 处理器提供了索引和基于地址模式,允许在单个指令中加载堆栈变量。使用 6502,您只能使用 X 或 Y 寄存器执行此操作,而且由于这些是唯一的通用寄存器,因此为数据堆栈指针保留一个的成本非常高。Z80 可以使用其 IX 或 IY 寄存器执行此操作,但不能使用堆栈指针寄存器执行此操作。然而,Z80 上的索引加载指令需要很长时间来执行,所以它仍然很昂贵,而且你要么为堆栈指针保留第二个寄存器,要么必须在任何时候从 SP 寄存器加载堆栈指针想要访问变量。

相比之下,如果不支持递归调用,则该函数的第二个实例无法在调用内部启动,而现有实例仍在进行中。这意味着一次只需要一组变量,您可以为每个函数分配自己的静态内存用于变量。由于内存具有固定位置,因此您可以使用固定地址加载。Fortran 的一些实现使用了这种方法。

  • 特别是,这不是 8 位 cpu 所固有的。相反,这是现有 8 位 cpu 的 ISA 设计非常糟糕的问题。 (2认同)