guidelines - c++ best practices
RTTI Overhead en C++ (4)
¿Cuáles son las sobrecargas de memoria / rendimiento de habilitar RTTI en un programa C ++?
¿Alguien puede, por favor, arrojar algo de luz entre la implementación interna del mecanismo RTTI y los gastos generales relevantes?
¿Entiendo cómo usar RTTI a través de typeid
y dynamic_cast
, lo que estoy tratando de saber son los detalles de la implementación interna de cómo el tiempo de ejecución hace un seguimiento de esta información y cómo es una sobrecarga?
Habilitar RTTI normalmente trae solo una pequeña sobrecarga. La implementación habitual lleva un puntero a la estructura de información de tipo en la tabla de un objeto. Como el vtable debe construirse de todas formas, el tiempo extra es pequeño, es como agregar otra función virtual a la clase.
typeid
es, por lo tanto, comparable a llamar a una función virtual. dynamic_cast
es más lento: debe atravesar la jerarquía de herencia para realizar una conversión. Llamar a dynamic_cast
demasiada frecuencia puede ser un cuello de botella en el rendimiento. Por '' puedo '' quiero decir que normalmente no ...
Existe un ligero aumento en el tamaño del ejecutable, ya que las estructuras de información de tipo deben almacenarse en algún lugar. En la mayoría de los casos no será relevante.
Me pregunto de dónde sacó la idea de RTTI "gastos generales"?
Leí en la red, que para proporcionar RTTI, algunos (tempranos) preprocesadores o traductores de C a C ++, herramientas similares (GObject, QT, Objective-C, no estoy seguro), y otros programas. langr generar un código "detrás de la escena", que generó algunos "gastos generales" en la memoria y la velocidad.
Leí que finalmente, esa "sobrecarga" se redujo y muchas veces se considera trivial.
Tal vez le gustaría programar en ensamblaje, o "plano C", sin sobrecarga RTTI, es mucho más fácil que C ++
Por favor lea la sección apropiada en este documento .
Para resumir:
typeid
(5.3.7): encuentre vtable, a través de ese encuentre el objeto de clase más derivado, luego extraiga type_info del vtable de ese objeto. Todavía es muy lento en comparación con la función de llamada;dynamic_cast
(5.3.8): encuentre type_info como se describe anteriormente, luego determine si la conversión es posible y luego ajuste los punteros. El costo en tiempo de ejecución depende de la posición relativa en la jerarquía de clases de las dos clases involucradas. Los análisis descendentes y cruzados son muy lentos en estos días (aunque here puede encontrar el artículo sobre la implementación posible (pero restringida) de Dynamic_cast en tiempo constante).
Primero, no hay manera de decir exactamente cuánta sobrecarga está involucrada sin especificar un compilador y una versión, ya que es un detalle de implementación. Dicho esto, es bien sabido que en algunos compiladores, dynamic_cast busca en la jerarquía de clases haciendo comparaciones de cadenas para hacer coincidir los nombres de las clases.