Frage

In C ++, was ist der Overhead (Speicher / CPU), die mit einer Basisklasse erben, die keine virtuellen Funktionen haben? Ist es so gut wie eine gerade nach oben Kopie + Paste von den Teilnehmern?

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

class b : public a
{

}

verglichen mit

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

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

}
War es hilfreich?

Lösung

Es könnte seinen Kopf einen leichten Speichers (durch padding), wenn Vererbung im Vergleich mit kopieren und Vergangenheit, sollten Sie die folgenden Klassendefinitionen:

struct A
{
  int i;
  char c1;
};

struct B1 : A
{
  char c2;
};


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

sizeof (B1) wird wahrscheinlich 12 sein, während sizeof (B2) nur 8. Dies ist sein könnte, da die Basisklasse A bis 8 Bytes separat aufgefüllt wird und dann wird B1 gepolstert wieder zu 12 Byte.

Andere Tipps

Es dauert sehr wenig länger zu kompilieren, und es wird keine zusätzliche Laufzeit-Overhead sein. Aus Sicht der Optimierer, sind nicht-virtuelle Methoden die gleiche wie Verfahren - können sie nur ihre Speicheradresse aufgerufen werden, ohne Aufwand von einer virtuellen Methodentabelle

.

Wenn Sie virtuelle Vererbung vergessen, mit einer Basisklasse entspricht, Speicher und Leistung klug, ein Mitglied der gleichen Klasse zu haben. Gestellte, dass es manchmal sogar besser sein (zum Beispiel eine leere Klasse hat eine Größe von mindestens einem aber eine leere Basisklasse hat, kann oft keinen Overhead).

Wenn Sie einen Zeiger vom Typ Basis * haben könnten, die auf ein Objekt vom Typ Derived * Punkte, müssen Sie wahrscheinlich einen virtuellen Destruktor und Ihre ursprüngliche Prämisse gilt nicht mehr. Wenn die abgeleitete Klasse einen leeren destructor hat, und es hat keine Mitglieder oder sie sind alle Arten POD, können Sie weg, ohne eine virtuelle destructor, aber es ist in der Regel besser ist es sicher zu spielen und es von Anfang an virtuellen machen.

Der Compiler einen direkten Aufruf an den Code generieren jede nicht-virtuelle Mitgliedsfunktion implementiert, so gibt es keinen Overhead.

Nicht wirklich, es erhöht nur die Erinnerung von der Basisklasse. Mehr erfahren Sie in hier in C ++ FAQ

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top