C++ Ottimizzazione della classe base vuota


Esempio

Un oggetto non può occupare meno di 1 byte, in quanto i membri di un array di questo tipo avrebbero lo stesso indirizzo. Quindi sizeof(T)>=1 sempre valido. È anche vero che una classe derivata non può essere più piccola di nessuna delle sue classi base. Tuttavia, quando la classe base è vuota, la sua dimensione non è necessariamente aggiunta alla classe derivata:

class Base {};

class Derived : public Base
{
public:
    int i;
};

In questo caso, non è necessario allocare un byte per Base in Derived per avere un indirizzo distinto per tipo per oggetto. Se viene eseguita l'ottimizzazione della classe base vuota (e non è richiesto alcun riempimento), quindi sizeof(Derived) == sizeof(int) , cioè, non viene eseguita alcuna allocazione aggiuntiva per la base vuota. Questo è possibile anche con più classi di base (in C ++, le basi multiple non possono avere lo stesso tipo, quindi non ci sono problemi da ciò).

Si noti che questo può essere eseguito solo se il primo membro di Derived differisce nel tipo da una qualsiasi delle classi di base. Questo include qualsiasi base comune diretta o indiretta. Se è lo stesso tipo di una delle basi (o c'è una base comune), è necessario allocare almeno un singolo byte per garantire che non ci siano due oggetti distinti dello stesso tipo con lo stesso indirizzo.