在编译器的设计,为什么,而不是具有一个呼叫者或被叫方登记册的节的安排,不能呼叫者通过名单的使用寄存器(即它将推动在情况下的一个叫节约安排)的被叫方所以这被叫方可以比较其表的使用注册的注册使用者。然后只有登记册,真正需要的是推动,将推动。我失去了一些东西?

有帮助吗?

解决方案

它是一个有趣的想法。我认为有两个东西,让不到有吸引力:

  • 被叫方已保留堆空间的最糟糕的情况下,不管。
  • 为使它有效率,你将需要特别指示用于储存和装载设置寄存器。这样的指令是对摩托罗拉68000(也许也支持),但他们没有被受欢迎。

这里是一个小阐述它如何会的工作:你想要呼叫者包列入一个字机如一位矢量。你会再需要被叫到按位和与其自己的名单,已经指示,将所有登记册的名字所产生的位矢量。

因为你要有保留空间,堆叠的最糟糕的是,你不保存在一个现代化的、超标量,以处理器,写入相同的超高速缓冲存储器线几乎是免费的。

这也是真的,如果你真的想要的是尽量减少载荷并储存在运行时,你只是去与所有呼叫者保存的登记册。这一战略也使得它真的很便宜提出一个例外,而以先发制人交换线程,以及大量的汇编者(喜欢 OCaml)用于这一原因。被叫方保存,注册是一种hack尝试切下来的码尺寸的溢出和重新装载的指示。他们的工作在许多情况下,他们保存空间,因为电话站点远远多于过程的定义(在平均水平,一过程包含多个呼叫)。

更多的信息,关于权衡之间的来电-保存和被叫方保存,注册,有一个 漂亮的纸张杰克*戴维森和大卫Whalley.

其他提示

效率非常低......你需要解析列表(对于每个函数!),这是完全没必要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top