Заголовок RTTI в C ++ - PullRequest
       53

Заголовок RTTI в C ++

17 голосов
/ 23 марта 2011

Каковы затраты памяти / производительности при включении RTTI в программе на C ++?
Кто-нибудь может пролить свет на внутреннюю реализацию механизма RTTI и соответствующие накладные расходы?
Я понимаю, как использовать RTTI через typeid и dynamic_cast, что я пытаюсь узнать, это внутренние подробности реализации того, как время выполнения отслеживает эту информацию и как это накладные расходы?

Ответы [ 4 ]

20 голосов
/ 23 марта 2011

Включение RTTI обычно приводит к небольшим накладным расходам. Обычная реализация несет указатель на структуру информации о типе в vtable объекта. Так как vtable должен быть создан в любом случае, дополнительное время невелико - это все равно, что добавить в класс другую виртуальную функцию.

typeid, следовательно, сравнимо с вызовом виртуальной функции. dynamic_cast медленнее - ему нужно пересечь иерархию наследования, чтобы выполнить приведение. Вызов dynamic_cast слишком часто может стать узким местом производительности. Под ' можно ' я имею в виду, что обычно это не будет ...

Существует небольшой размер в исполняемом размере, так как структуры typeinfo должны где-то храниться. В большинстве случаев это не будет актуально.

7 голосов
/ 23 марта 2011

Пожалуйста, прочитайте соответствующий раздел в этом документе .

Чтобы подвести итог:

  • typeid (5.3.7): найти vtableс помощью этого найти наиболее производный объект класса, а затем извлечь type_info из vtable этого объекта.Это все еще очень медленно по сравнению с вызовом функции;

  • dynamic_cast (5.3.8): найдите type_info, как описано выше, затем определите, возможно ли преобразование, затем настройте указатели.Стоимость выполнения зависит от относительной позиции в иерархии классов двух участвующих классов.В настоящее время даун- и кросс-броски очень медленны (хотя здесь вы можете найти статью о возможной (но ограниченной) реализации динамической передачи в постоянном времени).

1 голос
/ 23 марта 2011

Во-первых, невозможно точно сказать, сколько накладных расходов связано с указанием компилятора и версии, так как это деталь реализации. Тем не менее, хорошо известно, что в некоторых компиляторах dynamic_cast ищет иерархию классов, сравнивая строки с именами классов.

0 голосов
/ 23 марта 2011

Интересно, откуда взялась идея «издержек» RTTI?

Я читал в сети, что для обеспечения RTTI некоторые (ранние) препроцессоры или переводчики с C на C, аналогичные инструменты (GObject, QT, Objective-C, не уверен) и другие прогр.Langr.генерировать некоторый код «за кулисами», который действительно генерировал некоторые «издержки» в памяти и скорости.

Я читал, что со временем эта «нагрузка» уменьшилась и много раз считается тривиальной.

Может быть, вы хотите программировать на ассемблере, или «обычный C», без RTTI, намного проще, чем C ++

...