Подтвердить что ты не робот

Нет RTTI, но все же виртуальные методы

Код С++ может быть скомпилирован с отключенной информацией о времени выполнения, которая отключает dynamic_cast. Но виртуальные (полиморфные) методы по-прежнему необходимо отправлять на основе типа времени выполнения цели. Разве это не означает, что информация о типе присутствует в любом случае, а dynamic_cast должна всегда работать?

4b9b3361

Ответ 1

Отключение RTTI убивает dynamic_cast и typeid, но не влияет на виртуальные функции. Виртуальные функции отправляются через "vtable" классов, которые имеют любые виртуальные функции; если вы хотите избежать использования vtable, вы можете просто не иметь виртуальных функций.

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

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

Я видел производственные системы, в которых отключение RTTI сокращало размер исполняемых файлов на 50%. Большая часть из этого была связана с массивными именами строк, которые попадают в некоторые программы на С++, которые сильно используют шаблоны.