8位CPU对this question about compiler efficiency的回答似乎意味着允许递归使得C语言在这些体系结构上效率低下。我不明白递归函数调用(同一个函数)与重复调用各种函数有什么不同。
我想了解为什么会这样(或者为什么看起来很有学问的人会这么认为)。我可以猜测,这些架构可能只是没有堆栈空间,或者push/pop效率低下--但这些只是猜测。
发布于 2020-06-01 00:30:58
因为为了有效地实现C堆栈,您需要有效地加载和存储当前帧中的任意偏移量。例如,8086处理器提供了索引和基于地址的模式,允许在单个指令中加载堆栈变量。对于6502,您只能使用X或Y寄存器,而且由于这些寄存器是唯一的通用寄存器,因此为数据堆栈指针保留一个寄存器是非常昂贵的。Z80可以使用它的IX或IY寄存器来实现这一点,但不能使用堆栈指针寄存器。但是,Z80上的索引加载指令需要很长时间才能执行,因此仍然需要花费很大的代价,而且您可以为堆栈指针保留第二个寄存器,或者在任何时候要访问变量时都必须从SP寄存器加载堆栈指针。
相比之下,如果不支持递归调用,则函数的第二个实例无法在调用中启动,而现有的调用仍在进行中。这意味着一次只需要一组变量,您可以只为每个函数分配自己的静态内存,以便用于变量。由于内存有固定的位置,因此可以使用固定地址加载。fortran的一些实现使用了这种方法。
https://stackoverflow.com/questions/62124003
复制相似问题