sizeof derv2 : 8 => 8 bytes( virtual pointer + virtually base class) from base2 + 1 byte from test1 => 9 bytes and adds 3 padding bytes gives 12 bytes (should print). why "sizeof (test1)" is not adding in the output ?? sizeof derv22 : 8 => 8 bytes( virtual pointer + virtually base class) from base2 + 4 byte (virtually base class) from test1 => 12 bytes (should print) why 4 bytes from test1 (virtual base class) is not added in the output?? In the size of(derv1 ) also has a virtual base class( base1) and out put is 4 bytes means they added 4 bytes in the output. sizeof derv222: 12 => 12 bytes( virtual pointer + virtually derived) from base2 + 8 byte( virtual pointer + virtually derived) from test2 => 16 bytes (should print)
4 Réponses :
La raison pour laquelle L'optimisation de votre compilateur a fait, ne pas allouer des octets pour un sous-objet classe de base dont le type est une classe vide, est appelée « l'optimisation de la classe de base vide ». Il n'est pas requis par la norme que la mise en œuvre de l'appliquer, mais une mise en œuvre qui n'a pas peut-être pas être considérés comme aptes au travail sérieux. P>
Je pense que Apparemment sizeof (Base1) code> et
sizeof (test1) code> sont 1 est uniquement em> pour empêcher un objet plus dérivé d'avoir la taille 0. C'est tous les standards défend. sous-objets de classe de base sont autorisés à avoir la taille 0 (qui est, a permis d'occuper aucun octet), et par conséquent, en ajoutant
Base1 code> comme base ne nécessairement em> doivent ajouter quoi que ce soit à la taille de la classe. p>
derv22 code> est un peu similaire - si le compilateur est capable de traiter deux classes de base virtuelles à l'aide d'un seul pointeur supplémentaire, alors il a le droit de le faire. Par conséquent, vous pourriez ne « payer » une fois, plutôt que de « payer » par base virtuelle. Cela pourrait dépendre du compilateur et sur les relations exactes entre les classes, cependant, je ne l'ai jamais sondé différentes implémentations pour voir si et quand ils sont obligés d'ajouter plusieurs pointeurs valeur des frais généraux. P>
derv222 code> a fait, bien que, au moins pour votre compilateur. Je suppose que cela est parce que le
Base2 code> et
test2 code> sous-objets de classe de base besoin de séparer les pointeurs vtable. Probablement pas surprenant si l'on considère ce qui se passe lorsque vous
static_cast code> un
derv222 * code> comme un pointeur vers une base ou l'autre - les deux résultats doivent être capables d'avoir
show () code> appelé sur eux, et appelant différents em> fonctions (bien que le
Afficher code> fonctions font actuellement rien). Je ne suis pas sûr que ce serait possible pour un autre compilateur pour mettre en œuvre cet héritage en 8 octets -. Pour un héritage chose qui ne fonctionne pas Vous em> à mettre en œuvre en utilisant vtables p>
Comment déterminer la taille de virtuelle classe de base et cours dérivés de il ?? p> blockQuote>
Utiliser
Tailleof () Code>. P>
Mon ancien papier "C ++: sous la hotte" explique la mise en œuvre Microsoft C ++ des classes de base virtuelles.
0 commentaires
Une classe vide héritante d'une classe de base en mode virtuel (spécificateur d'accès) (ex.virtual public) a une taille de 8 tandis que si elle est non vide, il aurait une taille de 16. P>
Oui c'est dépendant du système. L'autre chose que vous manquez est que les frais de vue de la table équipée ne font aucune différence que ce soit et personne n'a besoin de s'inquiéter à ce sujet. C'est à moins que vous prévoyez de mettre en place un compilateur ou si vous avez un système avec des millions de multiples objets héritariat.