Question

Compiler la classe suivante

class Interface
{
  virtual void doIt() = 0;
  virtual ~Interface() = 0;
};

inline Interface::~Interface() {}

en utilisant gcc -fdump-class-hierarchy.

gcc émette

Class Interface
   size=4 align=4
   base size=4 base align=4
Interface (0x1a779c0) 0 nearly-empty
    vptr=((& Interface::_ZTV9Interface) + 8u)

Quelle est la signification de « presque vide »? Qu'est-ce que cela signifie?

Était-ce utile?

La solution

Le C ++ ABI fournit une définition de "presque vide" cours et une discussion intéressante sur la façon dont ils affectent la construction vtable:

  

Une classe qui contient un pointeur virtuel, mais pas d'autres données à l'exception (éventuellement) des bases virtuelles. En particulier, il:

     
      
  • n'a pas des membres de données non statiques autres que les champs de bits de longueur nulle,
  •   
  • n'a pas de classes de base qui ne sont pas directement soit vide, presque vide, ou virtuel,
  •   
  • a au plus une classe de base non virtuelle, directe presque vide, et
  •   
  • n'a pas une bonne classe de base qui est vide, pas moralement virtuel, et à un autre décalage à zéro.
  •   

Je suis tombé sur ce tout en recherchant l'effet des bases virtuelles presque vides sur la taille de l'objet, la taille vtable, et les frais généraux d'appel virtuel.

Autres conseils

Je suppose qu'il est pour le différencier de « vide », ce qui est ce que vous obtenez si compiler une classe sans les membres du tout. « Presque vide » semble signifier qu'il Hasa VTABLE et rien d'autre.

C ++ a quelque chose appelé "l'optimisation de base vide". Si une classe n'a pas de membres, il n'a pas besoin de prendre l'espace quand il est utilisé comme une classe de base. Un exemple de pourquoi il est important std::unary_function<T, U>. Il existe pour vous fournir un ensemble facile de typedefs. Ces typedefs ne devraient pas contribuer à la taille de votre classe foncteur.

Si vous avez une classe de base avec un pointeur vtable, ce pointeur peut probablement être partagé avec la classe dérivée. Vous créez simplement un vtable pour la classe dérivée qui ajoute ses propres méthodes après celle de la classe de base.

Vous pouvez maintenant obtenir un même « pas de surcharge » classe de base. Apparemment, GCC appelle que "presque vide".

Il a seulement vtable, pas de champs de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top