Domanda

Compila la seguente classe

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

inline Interface::~Interface() {}

utilizzando gcc -fdump-class-hierarchy.

emette gcc

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

Qual è il significato di "quasi-vuoto"? Che cosa significa?

È stato utile?

Soluzione

Il C ++ ABI fornisce una definizione di "quasi vuoto" classi e una interessante discussione su come influenzano la costruzione vtable:

  

Una classe che contiene un puntatore virtuale, ma non altri dati, ad eccezione (forse) basi virtuali. In particolare, esso:

     
      
  • non ha membri dati non statici non bitfields dimensione zero,
  •   
  • ha alcun classi base dirette che non sono o vuoti, quasi vuota, o virtuale,
  •   
  • ha al massimo un non virtuale, classe base diretta quasi vuoto, e
  •   
  • ha alcuna classe base appropriata che è vuoto, non morale virtuale, e ad un altro di offset di zero.
  •   

Ho eseguito attraverso questo, mentre la ricerca l'effetto di basi virtuali quasi vuoti sulle dimensioni dell'oggetto, delle dimensioni vtable e l'overhead chiamata virtuale.

Altri suggerimenti

Suppongo che sia per differenziarlo dal "vuoto", che è quello che si ottiene se compilare una classe senza membri a tutti. "Quasi-vuoto" sembra significare che Hasa VTable e nient'altro.

C ++ ha qualcosa chiamato "ottimizzazione base vuota". Se una classe non ha membri, che non ha bisogno di occupare spazio quando è usato come una classe di base. Un esempio del perché questo è importante è std::unary_function<T, U>. Esiste per fornire un semplice insieme di typedef. Quei typedef non dovrebbero contribuire alle dimensioni della vostra classe funtore.

Se si dispone di una classe base con un puntatore vtable, questo puntatore può probabilmente essere condivisi con la classe derivata. È sufficiente creare un vtable per la classe derivata che aggiunge i propri metodi, dopo quello della classe di base.

È ora possibile ottenere un simile "non appesantisce extra" classe di base. A quanto pare GCC chiama che "quasi vuota".

Ha solo un vtable, non i campi di dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top