4

我目前正在寻找实现动态调度的各种方法。

据我所知,有两种“简单”的方法可以实现这一点:

  • 虚函数表,如 C++ 中的
  • Message Dispatcher,就像在 SmallTalk 中一样(这有点类似于 Python 将方法存储为属性的想法__dict__

我会注意到,据我所知,选择 VFT 是因为它们执行合理且易于实现(也因为它们非常适合 C++ 单独编译模型),而不是因为它们是最快的方法。

我已经阅读了几篇文章和出版物,但是大多数都是“旧的”(我读到的最后一篇文章(*)提到了使用 Pentium 200MHz ...嗯),所以我怀疑它们是否代表了最先进的技术除非研究陷入僵局。

我对感兴趣:

  • 动态调度策略,如果它们支持多方法就更好了。
  • 各种策略的基准

我对最近的文章和不寻常的策略特别感兴趣(即使它们没有被证明是有效的)。

欢迎出版物,如果它们可以免费获得会更好,否则对所呈现的技术和结果的总结会很棒。

也欢迎真正编译器实现的技术文章。

(*)这篇关于 Eiffel 的文章说明了整个程序分析如何帮助删除虚拟呼叫站点。

4

1 回答 1

4

在阅读有关基于原型的对象系统的实现时,我遇到了以下多方法策略。它是在考虑该领域的情况下编写的,但适应更传统的基于类的语言并不难。

第 3 节详细介绍了它,图 5 是一个有用的图表。这个想法是每个可以调度的对象(或类,也许)都有自己的方法表。(从这个意义上说,它与 C++ 相当。)在该对象(或类)上调度的每个方法都放入表中。聪明的部分是表格被分成小节,对应于参数位置。

澄清一下:假设您有一个专门针对第一个参数的类“Foo”和第二个参数的类“Quux”的方法。Foo 类的调度表的第 1 节将包含一个指向该方法的指针。而且,类Quux的调度表的第二部分也将有一个指向该方法的指针。然后,要进行分派,请查阅参数类的分派表。如果方法指针匹配(如我们的示例中),那就是要调用的方法。

这篇论文被称为“Prototypes with Multiple Dispatch”。 http://lee.fov120.com/ecoop.pdf

于 2011-05-13T16:35:42.577 回答