c++ - programacion - Impacto en el rendimiento de la herencia virtual
herencia virtual c++ (3)
¿Seguro que te refieres a la herencia virtual? Si es así, es idéntico al costo de una llamada de función virtual normal. La búsqueda encadenada vtable simplemente sigue una ruta especificada.
Usted dijo que esto fue en el inicio. Es probable que la sobrecarga de su disco (simplemente por cargar su código en la memoria) requiera órdenes de magnitud más tiempo que la media docena de instrucciones para realizar búsquedas en vtable. Me sorprendería un poco si pudieras perfilar esto y detectar una diferencia.
Estoy considerando usar la herencia virtual en una aplicación en tiempo real. ¿El uso de la herencia virtual tiene un impacto en el rendimiento similar al de llamar a una función virtual? Los objetos en cuestión solo se crearían al inicio, pero me preocupa que todas las funciones de la jerarquía se envíen a través de un vtable o si solo las de la clase base virtual.
Eche un vistazo al siguiente estudio experimental a gran escala publicado en OOPSLA''96. Estoy copiando una entrada de bibtex, el resumen y un enlace al documento. Consideraría que este es el estudio experimental más completo sobre el tema hasta la fecha.
@article{driesen1996direct,
title={{The direct cost of virtual function calls in C++}},
author={Driesen, K. and H{//"o}lzle, U.},
journal={ACM Sigplan Notices},
volume={31},
number={10},
pages={306--323},
issn={0362-1340},
year={1996},
publisher={ACM}
}
Resumen: Estudiamos el costo directo de las llamadas a funciones virtuales en programas C ++, asumiendo la implementación estándar utilizando tablas de funciones virtuales. Medimos esta sobrecarga de forma experimental para una serie de grandes programas de referencia, utilizando una combinación de inspección ejecutable y simulación de procesador. Nuestros resultados muestran que los programas de C ++ medidos gastan una mediana del 5.2% de su tiempo y del 3.7% de sus instrucciones en el código de envío. Para las versiones de "todos los virtuales" de los programas, la sobrecarga media aumenta a 13.7% (13% de las instrucciones). La variante "thunk" de la implementación de la tabla de función virtual reduce la sobrecarga en una mediana del 21% con respecto a la implementación estándar. En futuros procesadores, es probable que estos gastos generales aumenten moderadamente
Las implementaciones comunes harán que el acceso a los datos de los miembros de las clases de base virtual utilicen una dirección indirecta adicional.
Como James señala en sus comentarios, llamar a una función miembro de una clase base en un escenario de herencia múltiple necesitará un ajuste del puntero, y si esa clase base es virtual, entonces el desplazamiento del subobjeto de la clase base en el derivado El objeto de la clase depende del tipo dinámico de la clase derivada y deberá calcularse en tiempo de ejecución.
Si esto tiene un impacto visible en el rendimiento de las aplicaciones del mundo real depende de muchas cosas:
¿Las bases virtuales tienen miembros de datos ? A menudo, las clases base abstractas deben derivarse de virtualmente, y las bases abstractas que tienen miembros de datos a menudo son un olor de código de todos modos.
Suponiendo que tenga bases virtuales con miembros de datos, ¿se accede a los que están en una ruta crítica ? Si un usuario que hace clic en algún botón en una GUI produce unas pocas docenas de direccionamientos adicionales, nadie lo notará.
¿Cuál sería la alternativa si se evitan las bases virtuales? No solo el diseño puede ser inferior, sino que también es probable que el diseño alternativo tenga un impacto en el rendimiento. Tiene que lograr el mismo objetivo, después de todo, y TANSTAAFL. Luego cambió una pérdida de rendimiento por otra más un diseño inferior.
Nota adicional: Eche un vistazo al Modelo de Objetos Internos al C ++ de Stan Lippmann, que responde a estas preguntas de manera exhaustiva.