Question

En C ++, ce qui est la surcharge (mémoire / cpu) associée à hériter d'une classe de base qui n'a pas de fonctions virtuelles? Est-il aussi bon qu'une copie en droit + coller des membres de la classe?

class a
{
public:
    void get();
protected:
    int _px;
}

class b : public a
{

}

par rapport à

class a
{
public:
    void get();
protected:
    int _px;
}

class b
{
public:
    void get();
protected:
    int _px;

}
Était-ce utile?

La solution

Il pourrait y avoir une légère être en tête de la mémoire (en raison de padding) lors de l'utilisation d'héritage par rapport à la copie et au-delà, tenez compte des définitions de classe suivante:

struct A
{
  int i;
  char c1;
};

struct B1 : A
{
  char c2;
};


struct B2
{
  int i;
  char c1;
  char c2;
};

sizeof (B1) sera probablement 12, tandis que sizeof (B2) pourrait bien être 8. En effet, la classe de base A se rembourré séparément à 8 octets puis B1 à nouveau se capitonné à 12 octets.

Autres conseils

Il faudra très légèrement plus pour compiler, et il n'y aura pas de frais généraux d'exécution supplémentaire. Du point de vue de l'optimiseur, les méthodes non virtuelles sont les mêmes que les procédures - elles peuvent être appelées à l'aide que leur adresse de mémoire, sans frais généraux d'une table de méthode virtuelle

.

Si vous oubliez l'héritage virtuel, ayant une classe de base est équivalente, la mémoire et la performance sage, d'avoir un membre de la même classe. Exceptées qu'il peut parfois être encore mieux (par exemple une classe vide a une taille d'au moins un, mais ayant une classe de base vide peut avoir souvent pas de frais généraux).

Si vous pourriez avoir un pointeur de type base * qui pointe vers un objet de type dérivé *, vous avez probablement besoin d'un destructeur virtuel et votre prémisse originale ne s'applique plus. Si la classe dérivée a une destructor vide, et il n'a pas de membres ou ils sont tous les types POD, vous pouvez vous en sortir sans destructor virtuel, mais il est généralement préférable de jouer la sécurité et le rendre virtuel dès le début.

Le compilateur génère un appel direct au code la mise en œuvre de chaque fonction de membre non virtuel, donc il n'y a pas de frais généraux.

Pas vraiment, il n'a augmenté que la mémoire de la classe de base. Vous pouvez en savoir plus en C ++ FAQ

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