2010-07-06 21 views
9

Prendendo il seguente frammento come un esempio:costi eredità in C++

struct Foo 
{ 
    typedef int type; 
}; 

class Bar : private Foo 
{ 
}; 

class Baz 
{ 
}; 

Come si può vedere, non funzioni virtuali esistono in questo rapporto. Dal momento che questo è il caso, sono le seguenti ipotesi accurate per quanto riguarda la lingua?

  • Nessuna tabella di funzioni virtuali verrà creata in Bar.
  • sizeof(Bar) == sizeof(Baz)

In sostanza, sto cercando di capire se sarò pagando alcun tipo di sanzione per fare questo. Il mio test iniziale (anche se su un singolo compilatore) indica che le mie asserzioni sono valide, ma non sono sicuro che questo sia l'ottimizzatore del mio compilatore o la specifica della lingua che è responsabile di ciò che sto vedendo.

+1

+1 per la vostra curiosità e curiosità. –

risposta

10

In base allo standard, la barra non è un tipo POD (plain old data), perché ha una base. Di conseguenza, lo standard fornisce ai compilatori C++ un'ampia gamma di informazioni su ciò che fanno con un tipo di questo tipo.

Tuttavia, molto pochi compilatori stanno per fare qualcosa di pazzo qui. L'unica cosa che probabilmente devi cercare è l'Empty Base Optimization. Per vari motivi tecnici, lo standard C++ richiede che a ogni istanza venga assegnato spazio di archiviazione. Per alcuni compilatori, a Foo verrà assegnato uno spazio dedicato nella classe bar. I compilatori che implementano l'ottimizzazione di base vuota (la maggior parte tutti in uso moderno) rimuoveranno comunque la base vuota.

Se il compilatore specificato non implementa EBO, quindi sizeof(foo) sarà almeno due volte sizeof(baz).

+0

c'è un modo per spegnere EBO? –

+0

@Gollum: certo, in due modi. 1. Consultare la documentazione dei compilatori per verificare se offrono questa opzione. 2. Rendi la base non vuota. Inserisci un 'char' o' int' inutilizzato lì :) –

+0

Superbo. Grazie per aver portato la mia attenzione su EBO. :) – chrosph

1

Sì, senza membri virtuali o variabili membro, non ci dovrebbe essere una differenza di dimensioni.

0

Per quanto ne so il compilatore lo ottimizzerà correttamente, se è necessaria alcuna ottimizzazione.