0

在第 4 页上,它说:

Objective-C 动态决定——在运行时——通过搜索接收者的类和父类来处理消息的代码。(Objective-C 运行时缓存搜索结果以获得更好的性能。)相比之下,C++ 编译器在编译时静态构造调度表。

我在 StackOverflow 和 Wikipedia 上阅读了很多内容,足以说明我对 C++ 是否支持 Dynamic Dispatch(有人说是动态绑定的实现)完全感到困惑。

任何人都能够弄清楚动态调度、动态绑定以及 C++ 是否支持其中之一或两者之间的区别?我不是 C++ 或 Objective-C 专家,我来自 Java、Python 和 PHP 世界。

4

6 回答 6

2

本书中提到的动态分派可能是在 C++ 上下文中通常提到的不同的动态分派:

  • C++ 支持虚函数形式的动态调度。尽管调用的实际函数取决于对象的动态类型,但相应的名称和参数在编译时确实是已知的。
  • 我不是 Objective C 专家,但我的理解是您可以在运行时动态地将函数添加到单个对象,这些对象在被调用时会被查找。C++ 不支持这种动态调度。
于 2012-01-02T21:01:02.317 回答
1

C++ 通过虚拟成员函数支持动态调度。

我不认为这本书是在说别的。它指出“C++ 编译器在编译时静态地构造一个调度表”。这是真的:用于实现动态分派的分派表(“vtable”)是在编译时构建的,至少在最常见的 C++ 实现中是这样。

于 2012-01-02T20:45:10.540 回答
1

您的标题与您的问题不同。

书中的陈述是正确的:C++ 虚拟调度是在运行时执行的,但调度表是在编译时生成的。但是,这与说 C++ 不支持“动态调度”不同。虚函数是动态分派的一种形式,但在“动态分派”一词下有很多层次的东西。

于 2012-01-02T20:45:24.860 回答
1

如果“动态调度”的意思是“在运行时更改调用哪个函数来调用给定对象的方法”,那么是的:C++ 没有-在语言级别-执行此操作的结构化本机机制(这意味着在运行时更改 v-table 指针,甚至是 v-table 内的函数指针:可以通过强制实现特定的构造来更改,但可能会伤害孩子 :-) 将其视为“色情编码”!)

但是C++有一个基于类继承和虚函数的“动态调度”。您可以通过将对象实现为子对象的聚合、为给定接口实现它们自己的变体(实质上是“行为模式”)以及在需要时更改子对象来实现最可能的动态调度。

于 2012-01-02T21:59:55.903 回答
1

基本上,通过使用关键字“virtual”,C++ 是“部分”动态的。我们通常将此功能称为“后期方法绑定”,它决定了在运行时调用的特定方法。

然而,OC 通过其强大的运行时系统是“纯粹的”动态的(不像 javascript 那样纯粹)。您可以在运行时添加方法和 ivars,更不用说在运行时选择正确的方法来调用。我们通常将此功能称为“动态消息调度”。

如您所见,从方法调用的角度来看,它们的功能几乎相同。详细的方法搜索过程不同(c++ 查找虚拟表,oc 在其类的方法列表中试试运气),但它们都获得了运行时的灵活性。

于 2014-01-07T03:06:53.983 回答
0

C++确实支持通过虚函数进行动态调度。

但是,它(本机)不支持双重分派,这是一个根据对象运行时类型和方法参数的运行时类型确定要调用的方法的系统。

于 2012-01-02T20:45:55.020 回答