2010-07-06 14 views
9

Tomando el siguiente fragmento como un ejemplo:Costos herencia en C++

struct Foo 
{ 
    typedef int type; 
}; 

class Bar : private Foo 
{ 
}; 

class Baz 
{ 
}; 

Como se puede ver, no existen funciones virtuales en esta relación. Dado que este es el caso, ¿las siguientes suposiciones son precisas en lo que se refiere al lenguaje?

  • No se creará tabla de funciones virtuales en Bar.
  • sizeof(Bar) == sizeof(Baz)

Básicamente, estoy tratando de averiguar si voy a estar pagando ningún tipo de sanción por hacer esto. Mi prueba inicial (aunque en un único compilador) indica que mis afirmaciones son válidas, pero no estoy seguro de si este es el optimizador de mi compilador o la especificación del lenguaje que es responsable de lo que estoy viendo.

+1

+1 por su curiosidad e inquietud. –

Respuesta

10

De acuerdo con la norma, Bar no es un tipo POD (datos antiguos simples), porque tiene una base. Como resultado, el estándar otorga a los compiladores de C++ una amplia latitud con lo que hacen con dicho tipo.

Sin embargo, muy pocos compiladores van a hacer algo loco aquí. Lo único que probablemente tenga que tener en cuenta es la Optimización de Base Vacía. Por diversas razones técnicas, el estándar de C++ requiere que a cada instancia se le asigne espacio de almacenamiento. Para algunos compiladores, a Foo se le asignará espacio dedicado en la clase bar. Sin embargo, los compiladores que implementan la Optimización de base vacía (la mayoría en uso moderno) eliminarán la base vacía.

Si el compilador dado no implementa EBO, entonces sizeof(foo) será al menos dos veces sizeof(baz).

+0

¿hay alguna manera de desactivar EBO? –

+0

@Gollum: Claro, de dos maneras. 1. Consulte la documentación de sus compiladores para ver si ofrecen dicha opción. 2. Haga que la base no esté vacía. Pegue un 'char' o' int' no utilizado allí :) –

+0

Excelente. Gracias por llamar mi atención sobre EBO. :) – chrosph

1

Sí, sin miembros virtuales o variables miembro, no debería haber una diferencia de tamaño.

0

Por lo que sé, el compilador optimizará esto correctamente, si se necesita alguna optimización.