Notez qu'on voit aussi le terme EBO (Empty Base Optimization) dans la littérature
Imaginez le code suivant :
struct X { };
struct Y { X x; };
struct Z { char c; X x; };
int main() {
cout << sizeof(X) << endl; // probablement 1
cout << sizeof(Y) << endl; // probablement 1 (!)
cout << sizeof(Z) << endl; // probablement 2
}
Le fait que sizeof(X)==sizeof(Y) même si X est une classe vide et Y ne l'est pas découle du fait que tout objet en C++ doit occuper au moins un byte d'espace en mémoire. Ainsi, bien que X soit vide, au moins un byte doit être attribué pour chaque instance de X. Ceci est nécessaire pour assurer à chaque objet une adresse distincte.
Cela dit, puisque Y n'est pas vide, sa taille est proportionnelle à la somme de la taille de ses attributs (l'alignement joue aussi un rôle ici). Pour cette raison, sizeof(Y)==sizeof(char). Ceci explique d'ailleurs aussi la valeur de sizeof(Z), qui est proportionnelle à sizeof(X)+sizeof(char).
Maintenant, examinez le code suivant, qui ressemble au précédent, mais avec de subtils ajustements :
struct X { };
struct Y : X { };
struct Z : X { char c; };
int main() {
cout << sizeof(X) << endl; // probablement 1
cout << sizeof(Y) << endl; // probablement 1
cout << sizeof(Z) << endl; // probablement 1 (!)
}
Que se passe-t-il? Ici, Y et Z dérivent de la classe vide X. Puisque les enfants occupent déjà au moins un byte de mémoire, il n'est plus nécessaire d'attribuer l'espace d'entreposage (artificiel) d'une instance de X dans ces enfants.
C'est ce qu'on appelle l'Empty Base Class Optimization, ou EBCO. Cette optimisation permet à un compilateur d'« aplatir » une classe parent dans son enfant lorsque le parent n'a pas d'attributs d'instance. Par exemple :
struct Base { // n'a aucun attribut d'instance; en pratique, un Base occupe au moins un byte en mémoire
int f() const { return 3; }
};
struct E0 {
Base base; // ici, base occupe au moins un byte d'espace dans E0
};
struct E1 : Base { // ici, la partie Base d'un E1 peut ne pas occuper d'espace dans ce E1
};
En tenant compte de considérations d'alignement, cette optimisation peut rapporter beaucoup en pratique.
Quelques liens pour enrichir le propos.