gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:04:39 25 4
gpt4 key购买 nike

我无法理解“通过 vtable 调度比散列表更快,但如果在任何地方使用会消耗大量内存。”这是在这个博客objc_explain_objc_msgSend_vtable

最佳答案

Obj-C 不是 C++。

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

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

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

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

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

关于ios - 通过 vtable 调度比散列表更快,但如果在任何地方使用会消耗大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53249744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com