Il se trouve que votre classe Base
a 8 octets d'alignement, mais son dernier membre a la taille 4. Cela conduit à un vide remplissage de la zone d'ajouter à la fin de l' Base
s'disposition de la mémoire. Que rembourrage supplémentaire joue son rôle d'instancier des objets de la classe Base
par eux-mêmes, comme c'est appelé la plupart des objets dérivés.
Base b; // <- a most-derived object
Base a[10]; // <- an array of most-derived objects
Toutefois, lorsque vous "intégrer" Base
comme classe de base dans la classe Derived
, il n'y a pas besoin de rembourrage supplémentaire à la fin de l'embedded Base
sous-objet.
Derived d; // <- object `d` contains an embedded sub-object of type `Base`
Une smart compilateur va tenter de réutiliser cette zone en plaçant le champ supplémentaire de classe Derived
dans la zone d'affichage utilisé pour le remplissage en Base
. Dans votre cas, le champ supplémentaire Derived::f
a d'ailleurs la même taille de 4 octets, c'est à dire qu'il s'adapte-il à la perfection. Le résultat final est que la taille totale de la classe ne permet pas d'augmenter.
Une très similaires (dans la nature) effet est appelé "vide optimisation de la base". En C++ sizeof
pour tout type est garanti pour être plus grand que 0, ce qui signifie qu' sizeof
d'une classe vide est toujours plus grande que zéro. Toutefois, lorsque vous dérivez classe à partir d'un vide de la classe de base, vous pouvez observer que la classe de base contribue exactement 0 octets à la dérivée de la classe de taille. Par exemple
struct A {};
struct B {};
struct C {};
struct D {};
struct F : A, B, C, D {
int i;
}
int main() {
std::cout << sizeof(A) << std::endl << sizeof(B) << std::endl <<
sizeof(C) << std::endl << sizeof(D) << std::endl;
std::cout << sizeof(F) << std::endl;
}
Même si sizeof
de chaque classe de base est supérieure à zéro, sizeof(F)
généralement encore évaluer à l' sizeof(int)
, comme si la classe de base sous-objets n'existent pas.
En d'autres termes, comme ces exemples le montrent, la classe de base sous-objets suivez nettement plus détendue règles relatives à leur disposition de la mémoire que la plupart des objets dérivés. Ces règles assouplies pourrait facilement conduire à des situations lors de l' sizeof
de la classe de base ne sera que partiellement de contribuer à la sizeof
de la classe dérivée.