2012-08-14 12 views
6

En C++ compilado con -O3, tiene herencia sin virtualidad tienen un costo en términos de:Coste de tiempo de ejecución de la herencia (sin virtualidad) en C++?

  • tiempo de ejecución
  • memoria

Si la respuesta es sí: ¿por qué?

Como ejemplo: ¿son MyClass1 y MyClass2 equivalentes en términos de rendimiento y memoria?

enter image description here

+0

En teoría, no debería haber diferencia en el rendimiento. En la práctica ... bueno, mida sus escenarios particulares y descubra (no esperaría ninguna diferencia con altos niveles de optimización, pero quizás el compilador no logre alinear las llamadas al constructor de la clase base, o podría no realizar EBO, o ... todo tipo de cosas _podría ocurrir, incluso podría ser más rápido. La forma de averiguarlo es medir). –

+0

posible duplicado de [¿Cuál es el costo de la herencia?] (Http://stackoverflow.com/questions/7210412/what-is-the-cost-of-inheritance) –

+0

+1: Bonita imagen. –

Respuesta

8

tiempo de ejecución

Por qué? Las funciones se resuelven estáticamente, por lo que las llamadas a funciones son las mismas. El constructor MyClass1 llamará a los constructores de las clases base, y su destructor llamará a los destructores de las clases base, por lo que para la destrucción de la construcción & puede haber una sobrecarga. Tal vez. Algunos compiladores pueden optimizar las llamadas de distancia.

memoria

Ésta será la misma, tanto sólo tienen un miembro de double. Teóricamente Depende de la implementación, supongo, ya que no es un requisito del estándar, pero lo más común es que no haya gastos generales de memoria.

Nota que la supresión de un objeto MyClass1 a través de un puntero a Derived resulta en un comportamiento indefinido, porque no hay virtual destructor.

Nota 2 herencia sin polimorfismo es un olor a código. No dice que está mal, pero en la mayoría de los casos la composición es mejor.

+0

Y dado que los constructores y los destructores son bastante simples, deberían estar en línea y el compilador generará el mismo código para ambas versiones. –

+0

Acerca de la construcción y la destrucción: ¿los compiladores optimizarán la construcción/destrucción temporal para los operadores sobrecargados definidos en la Base? – Vincent

+0

@Vincent - No entiendo la pregunta. No existe una conexión inherente entre operadores sobrecargados y temporales. –

-3

En términos de espacio de memoria, supongo que su MyClass1 consume más porque necesita realizar un seguimiento de todas las relaciones y estructura de clase. Para el rendimiento, no veo ninguna diferencia notable.

+3

Dudo que esto sea cierto. –

+0

Secundado. ¿Te importa dar una cita, o al menos razonar? – delnan

+0

La estructura de la clase y las relaciones son manejadas por el compilador. Sin virtuales, no hay penalización de espacio de ejecución para estos. –

Cuestiones relacionadas