Если оставить в стороне все опасения по поводу необходимости использования typeid
и dynamic_cast
и их сомнительного влияния на обслуживание кода, есть ли какая-либо информация о производительности этих двух механизмов самоанализа динамического типа? В статье Википедии о RTTI утверждается, что:
Использование typeid в неполиморфном контексте часто предпочтительнее, чем dynamic_cast‹class_type› в ситуациях, когда нужна только информация о классе, потому что typeid всегда является процедурой с постоянным временем, тогда как dynamic_cast может потребоваться пройти через решетку производных классов. своего аргумента во время выполнения.
Однако цитата не приводится. Поэтому я хотел спросить, верно ли это утверждение и следует ли определенно предпочесть один из этих двух механизмов с точки зрения производительности другому. Мне не удалось найти информацию о каких-либо ограничениях на временную сложность этих операций.
typeid
вы можете проверить определенный тип, но не совместимость типа (как вы могли бы сделать сdynamic_cast
): Counter Пример в Compiler Explorer - person Scheff's Cat   schedule 14.05.2021typeid
операция, похоже, реализована как сравнение указателей между указателями (хранящимися в vtable) на соответствующие объектыstd::type_info
. Clang даже оптимизирует его. Между тем,dynamic_cast
вызывает непрозрачную функцию__dynamic_cast
сstd::type_info
в качестве аргументов, поэтому трудно сказать, как ее производительность сравнивается с производительностьюtypeid
, не зная реализации. Хотя, конечно, сам вызов функции уже является накладным, чего не происходит сtypeid
. - person janekb04   schedule 14.05.2021dynamic_cast
может следовать дереву наследования, я предполагаю, что он делает немного больше, чем просто сравнивает два указателя vtable. - person Scheff's Cat   schedule 14.05.2021type_info
не обязательно должно быть таким дешевым. Этот вопрос говорит о реализациях, использующихstrcmp
: stackoverflow.com/questions/49773686/ . Этот файл libstdc++, кажется, подтверждает: gcc.gnu.org /onlinedocs/gcc-7.5.0/libstdc++/api/ . - person janekb04   schedule 14.05.2021