9
votes

Comment déterminer la taille de la classe de base virtuelle et des cours dérivés de celui-ci?

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)
c++

1 commentaires

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.


4 Réponses :


10
votes

La raison pour laquelle sizeof (Base1) et sizeof (test1) sont 1 est uniquement 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 comme base ne nécessairement doivent ajouter quoi que ce soit à la taille de la classe.

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.

Je pense que derv22 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.

Apparemment derv222 a fait, bien que, au moins pour votre compilateur. Je suppose que cela est parce que le Base2 et test2 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 un derv222 * comme un pointeur vers une base ou l'autre - les deux résultats doivent être capables d'avoir show () appelé sur eux, et appelant différents fonctions (bien que le Afficher 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 à mettre en œuvre en utilisant vtables


0 commentaires

5
votes

Comment déterminer la taille de virtuelle classe de base et cours dérivés de il ??

Utiliser Tailleof () .


0 commentaires

3
votes

Mon ancien papier "C ++: sous la hotte" explique la mise en œuvre Microsoft C ++ des classes de base virtuelles. 0 commentaires


0
votes

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.


0 commentaires