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



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

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

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

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