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

RTDE накладные расходы в С++

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Подводя итог:

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

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

Ответ 3

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

Ответ 4

Интересно, откуда появилась идея RTZ "накладных расходов"?

Я читал в сети, что для предоставления R.T.T.I. некоторых (ранних) препроцессоров или переводчиков C на С++ аналогичные инструменты (GObject, QT, Objective-C, не уверены) и другие прогр. Langr. генерировать некоторый код "за сценой", который генерировал некоторые "служебные данные" в памяти и скорости.

Я читал, что в конечном итоге "накладные расходы" были уменьшены и много раз считаются тривиальными.

Возможно, вы хотите запрограммировать в сборке или "plain C", без R.T.T.I. накладные расходы, намного проще, чем С++