Диспетчеризация через vtable выполняется быстрее, чем в хэш-таблице, но при использовании везде используется огромное количество памяти - PullRequest
0 голосов
/ 11 ноября 2018

Я не могу понять, что «отправка через vtable происходит быстрее, чем хеш-таблица, но потребляет огромное количество памяти, если используется везде».который находится в этом блоге objc_explain_objc_msgSend_vtable

1 Ответ

0 голосов
/ 11 ноября 2018

Obj-C не является C ++.

В C ++ каждый класс имеет известный (во время компиляции) набор виртуальных функций, который обычно значительно меньше, чем полный набор функций, определенных для этого класса и всех его подклассов. (В C ++ вы должны явно указать, какие функции являются виртуальными, и по умолчанию они не являются.)

В Obj-C каждый метод является «виртуальным» (на языке C ++), список селекторов является переменным, методы могут быть переопределены во время выполнения (добавлены и заменены), а список неопределен (технически, вы можете отправить любой объект любое сообщение, даже если оно не отвечает, делает это).

Так что в C ++ довольно просто построить линейный массив каждой виртуальной функции, которую объект должен будет отправить, назначить смещение в этом массиве для каждой функции и скомпилировать его в код.

Если вы хотите использовать виртуальные диспетчерские таблицы в Obj-C, вам нужно создать массив для каждого класса, который содержит каждый возможный селектор. Для даже скромных программ каждый список будет огромным, и он будет расти в геометрической прогрессии с ростом сложности проекта Я имею в виду, что каждый класс будет иметь свой собственный массив (что?) 20000 различных селекторов, и есть тысячи классов ...

С другой стороны, хэш-таблица содержит набор переменных указателей на функции метода, определенных для этого класса. Набор обычно является только подмножеством селекторов, которые фактически были отправлены этим объектам, поэтому он намного ( намного ) меньше, чем полный набор селекторов, которые вы потенциально могли бы отправить объекту этого класса. Это делает хеш-таблицу методов эффективной и самооптимизируемой, даже если отправка занимает немного больше времени.

...