Pregunta

Compilar la siguiente clase

class Interface
{
  virtual void doIt() = 0;
  virtual ~Interface() = 0;
};

inline Interface::~Interface() {}

usando gcc -fdump-class-hierarchy.

emite gcc

Class Interface
   size=4 align=4
   base size=4 base align=4
Interface (0x1a779c0) 0 nearly-empty
    vptr=((& Interface::_ZTV9Interface) + 8u)

¿Cuál es el significado de "casi vacío"? ¿Qué significa?

¿Fue útil?

Solución

El C ++ ABI proporciona una definición de "casi vacío" clases y una interesante discusión de cómo afectan a la construcción vtable:

  

Una clase que contiene un puntero virtual, pero no otros datos, excepto (posiblemente) bases virtuales. En particular, es el siguiente:

     
      
  • no tiene miembros de datos no estáticos distintos de los campos de bits de anchura cero,
  •   
  • no tiene clases base directos que no son ya sea vacía, casi vacío, o virtual,
  •   
  • tiene a lo sumo no virtual, clase base directa casi vacío uno, y
  •   
  • no tiene ninguna clase base adecuada que está vacío, no es moralmente virtual, y al otro desplazamiento de cero.
  •   

Me encontré con esto mientras investigando el efecto de las bases virtuales casi vacías en el tamaño del objeto, tamaño vtable, y la sobrecarga de llamadas virtual.

Otros consejos

supongo que es para diferenciarlo de "vacío", que es lo que se obtiene si compilar una clase que no tiene miembros en absoluto. "Casi vacío" parece significar que Hasa VTABLE y nada más.

C ++ tiene algo que se llama una "optimización de base vacía". Si una clase no tiene miembros, que no tenga que ocupar espacio cuando se utiliza como clase base. Un ejemplo de por qué esto es importante es std::unary_function<T, U>. Existe para ofrecerle un conjunto fácil de typedefs. Esos typedefs no deben contribuir al tamaño de su clase funtor.

Si usted tiene una clase base con un puntero vtable, este puntero puede ser probable compartido con la clase derivada. Sólo tiene que crear un vtable para la clase derivada que añade sus propios métodos después de la de la clase base.

Ahora puede lograr una "carga extra" clase base similar. Al parecer GCC pide que "casi vacío".

Sólo tiene un vtable, no hay campos de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top