Возможный дубликат:
Вопрос о виртуальном механизме в С++
Использует ли vtable единственный способ реализовать механизм функций виртуальных членов в С++? Какие существуют другие способы?
Возможный дубликат:
Вопрос о виртуальном механизме в С++
Использует ли vtable единственный способ реализовать механизм функций виртуальных членов в С++? Какие существуют другие способы?
Другим известным механизмом являются функции диспетчеризации типов. Эффективно, вы заменяете указатель vtable на typeid (маленькое перечисление). Компонент (dyanmic) собирает все переопределения данной виртуальной функции и переносит их в один большой оператор switch в поле typeid.
Теоретическое обоснование состоит в том, что это заменяет косвенный скачок (не предикатируемый) множеством предикативных переходов. С некоторыми умениями при выборе значений перечисления оператор switch также может быть достаточно эффективным (то есть лучше, чем линейный)
Технически, все, что требуется для динамической отправки, - это возможность идентифицировать динамический тип объекта, указав указатель на него. Таким образом, любое скрытое (или не скрытое) поле typeid будет работать.
Динамическая отправка будет использовать этот typeid для поиска связанных функций. Эта ассоциация может быть hastable или массив, где typeid является индексом или любой другой подходящей связью. Вероятно, vptr - это способ достичь этого в наименьшем количестве шагов.
Другой возможной реализацией будет сохранение указателей на виртуальные функции непосредственно в объекты. Конечно, это решение никогда не используется на практике (по крайней мере, на каких-либо языках, о которых я знаю), поскольку это привело бы к резкому увеличению объема памяти. Однако интересно отметить, что код, использующий эту реализацию, может действительно работать быстрее, поскольку он удаляет слой косвенности, подавляя необходимость в vptr.
Я не знаю ни одного компилятора, который реализует виртуальные функции без использования подхода vtable.
Теоретически, однако, можно создать внутреннюю карту указателей объектов и таблицу указателей на виртуальные функции, напримерmap<objPtr, functionTable*>
, для реализации динамического полиморфизма с помощью виртуальных функций. Но тогда это приведет к тому, что динамическая диспетчеризация будет медленнее, чем vtable-подход.
Кажется, что vtable-подход, вероятно, самый быстрый механизм для реализации динамического полиморфизма. Возможно, поэтому все компиляторы используют такой подход!