Question intéressante. J'ai un exemple où une classe dérivée, avec un champ supplémentaire est la même taille comme un vide de la classe de base. (Ce devrait être un commentaire mais il est beaucoup trop grand; veuillez accepter l'une des autres réponses, bien que les upvotes sont les bienvenus si c'est intéressant.)
Considérer cette triviale programme en C++:
class A {};
class B : public A {
int m_iInteger;
};
int _tmain(int argc, _TCHAR* argv[])
{
printf("A: %d\r\n", sizeof(A));
printf("B: %d\r\n", sizeof(B));
printf("int: %d\r\n", sizeof(int));
return 0;
}
Qu'attendez-vous la sortie, si sizeof(int)
4? Peut-être quelque chose comme:
A: 0
B: 4
int: 4
?
Mon compilateur - Embarcadero C++ Builder 2010 - donne le résultat:
A: 8
B: 8
int: 4
En d'autres termes, l'ajout d'un champ supplémentaire dans la classe dérivée n'a pas la classe dérivée plus grand.
Il y a une certaine idée de la raison pour laquelle dans la rubrique du fichier d'aide sur l' option de compatibilité de longueur Nulle vide de la classe de base.
En général la taille d'une classe est au moins un octet, même si la classe
ne pas définir toutes les données membres. Lorsque vous sélectionnez cette option, l'
compilateur ignore ce inutilisés octet pour la disposition de la mémoire et le total des
taille des classes dérivées; vide classes de base ne consomment pas d'espace
dans les classes dérivées. Par Défaut = False
Il semble que la taille d'une classe avec des options de compilation par défaut pour ce compilateur est de 8 octets, pas un, et en fait un changement de ce paramètre pour cet exemple de code n'a aucun effet.
Vous pouvez également trouver cet article sur la base de la taille des classes et au-dessus de l'optimisation intéressante. Il explique pourquoi les classes doivent avoir une taille d'au moins un octet, ce que l'optimisation n', et plonge dans la représentation de fonctions de membre etc trop:
En effet, la norme exige que la taille d'un objet ne doit jamais
être égal à zéro; il exige aussi que dans un objet dérivé de données des membres de l'
classe de base(es) doivent apparaître avant que l'utilisateur de données déclaré les membres de la
la classe dérivée. Cependant, une classe de base sous-objet n'est pas considéré comme un
objet complet. Par conséquent, il est possible de supprimer la classe de base
sous-objet de l'objet dérivé, sans violer les règles. Dans
d'autres termes, l'objet t, le décalage de S et x peuvent se chevaucher...
Veuillez lire l'article pour le contexte de cette citation.