为什么允许递归使 C slower/inefficient 在 8 位 CPU 上
Why does allowing for recursion make C slower/inefficient on 8-bit CPUs
针对 8 位 CPU 对 this question about compiler efficiency 的回答似乎暗示 允许递归 使得 C 语言在这些体系结构上效率低下。我不明白(同一函数的)递归函数调用与对各种函数的重复函数调用有何不同。
我想明白为什么会这样(或者为什么貌似有学问的人会这么认为)。我猜想也许这些架构只是没有堆栈-space,或者 push/pop 效率低下 - 但这些只是猜测。
因为要有效地实现 C 堆栈,您需要能够有效地加载和存储到当前帧内的任意偏移量。例如,8086 处理器提供索引和基地址模式,允许在单个指令中加载堆栈变量。对于 6502,您只能使用 X 或 Y 寄存器执行此操作,并且由于这些是唯一的通用寄存器,因此为数据堆栈指针保留一个非常昂贵。 Z80 可以使用其 IX 或 IY 寄存器来执行此操作,但不能使用堆栈指针寄存器。然而,Z80 上的索引加载指令需要很长时间才能执行,所以它仍然很昂贵,而且你要么为堆栈指针保留第二个寄存器,要么必须在任何时候从 SP 寄存器加载堆栈指针想要访问变量。
相比之下,如果不支持递归调用,则当现有函数仍在进行中时,该函数的第二个实例无法在调用中启动。这意味着一次只需要一组变量,您只需为每个函数分配其自己的静态内存块以用于变量。由于内存具有固定位置,因此您可以使用固定地址加载。 Fortran 的一些实现使用了这种方法。
针对 8 位 CPU 对 this question about compiler efficiency 的回答似乎暗示 允许递归 使得 C 语言在这些体系结构上效率低下。我不明白(同一函数的)递归函数调用与对各种函数的重复函数调用有何不同。
我想明白为什么会这样(或者为什么貌似有学问的人会这么认为)。我猜想也许这些架构只是没有堆栈-space,或者 push/pop 效率低下 - 但这些只是猜测。
因为要有效地实现 C 堆栈,您需要能够有效地加载和存储到当前帧内的任意偏移量。例如,8086 处理器提供索引和基地址模式,允许在单个指令中加载堆栈变量。对于 6502,您只能使用 X 或 Y 寄存器执行此操作,并且由于这些是唯一的通用寄存器,因此为数据堆栈指针保留一个非常昂贵。 Z80 可以使用其 IX 或 IY 寄存器来执行此操作,但不能使用堆栈指针寄存器。然而,Z80 上的索引加载指令需要很长时间才能执行,所以它仍然很昂贵,而且你要么为堆栈指针保留第二个寄存器,要么必须在任何时候从 SP 寄存器加载堆栈指针想要访问变量。
相比之下,如果不支持递归调用,则当现有函数仍在进行中时,该函数的第二个实例无法在调用中启动。这意味着一次只需要一组变量,您只需为每个函数分配其自己的静态内存块以用于变量。由于内存具有固定位置,因此您可以使用固定地址加载。 Fortran 的一些实现使用了这种方法。