通过 vtable 的调度比散列 table 更快,但如果在任何地方使用都会消耗大量内存

Dispatch via vtable is faster than a hash table, but would consume tremendous amounts of memory if used everywhere

我看不懂"Dispatch via vtable is faster than a hash table, but would consume tremendous amounts of memory if used everywhere."在这个博客里objc_explain_objc_msgSend_vtable

Obj-C 不是 C++。

在 C++ 中,每个 class 都有一个已知的(在编译时)虚函数集,通常 显着 小于为 定义的完整函数集class 及其所有子class。 (在 C++ 中,您必须明确标记哪些函数是虚函数,默认情况下它们不是。)

在 Obj-C 中,每个方法都是 "virtual"(用 C++ 来说),选择器列表是可变的,方法可以在运行时重新定义(添加和替换),并且列表是不确定的(从技术上讲,你可以向任何对象发送任何消息,即使它没有响应也可以发送)。

因此在 C++ 中,为对象需要分派的每个虚函数构建一个线性数组,为每个函数分配一个偏移量到该数组,并将其编译到代码中是非常简单的。

如果你想在 Obj-C 中使用虚拟分派 tables,你必须为 every class 创建一个数组,其中包含 所有可能的 选择器。即使是最普通的程序,每个列表也会非常庞大​​,并且会随着项目的复杂性呈指数级增长。我的意思是,每个 class 都有自己的数组(什么?)20,000 个不同的选择器,并且有数千个 classes...

另一方面,散列 table 包含为该 class 定义的一组可变方法函数指针。该集合通常只是实际发送到这些对象的选择器的子集,因此它比您可能发送到对象的完整选择器集小得多 (much)其中 class。这使得方法的散列 table 高效且自我优化,即使调度需要更长的时间。