Методы динамической отправки

Обсуждение

Я знаю, что все известные мне реализации (например, компиляторы C++) реализуют динамическую диспетчеризацию с помощью виртуальных таблиц диспетчеризации и указателей виртуальных таблиц (т. е. известных vtable и vptr).

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

Вопросы

Q1. Существуют ли какие-либо другие допустимые методы, кроме vtables и vptrs, с помощью которых можно было бы реализовать динамическую диспетчеризацию?

Вопрос 2. Если Вопрос 1 верен: по каким причинам, если таковые имеются, разработчики решили использовать vtables и vptrs для реализации динамической диспетчеризации вместо какого-либо другого допустимого метода?


person 101010    schedule 08.08.2014    source источник


Ответы (1)


Q1: Динамические компиляторы могут реализовывать виртуальные функции быстрее, чем с помощью виртуальной таблицы. Скажем, метод является виртуальным, но все объекты, созданные до сих пор, используют реализацию X. Динамический компилятор вызовет прямой вызов реализации X или даже встроит ее. Когда создается объект, использующий другую реализацию, весь код, который теперь может быть неправильным, будет перекомпилирован.

Даже при наличии двух реализаций динамический компилятор может выдать код типа "if (объект использует реализацию X) { inlined_code_for_x(); } else { recompile_this_code(); }

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

person gnasher729    schedule 08.08.2014