Frage

Kompilieren Sie die folgende Klasse

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

inline Interface::~Interface() {}

gcc -fdump-class-hierarchy verwendet wird.

gcc aussendet

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

Was ist die Bedeutung von „fast leer“? Was bedeutet das?

War es hilfreich?

Lösung

Das C ++ ABI eine Definition von "fast leer" Klassen und eine interessante Diskussion darüber, wie sie beeinflussen vTable Konstruktion:

  

Eine Klasse, die einen virtuellen Zeiger enthält, aber keine anderen Daten außer (möglicherweise) virtuellen Basen. Insbesondere ist es:

     
      
  • hat keine nicht-statische Datenelemente ungleich Null-Breite bitfields,
  •   
  • hat keine direkten Basisklassen, die nicht entweder leer, fast leer sind, oder virtuell,
  •   
  • hat höchstens eine nicht-virtuelle, fast leere direkte Basisklasse, und
  •   
  • hat keine richtige Basisklasse, die nicht moralisch virtuelle leer ist, und mit einem Versatz von Null.
  •   

ich auf diesem während lief die Wirkung von fast leeren virtuellen Basen auf Objektgröße, VTable Größe und virtuelle Call-Overhead zu erforschen.

Andere Tipps

Ich nehme an, es ist es zu unterscheiden von „leer“, das ist, was Sie bekommen, wenn Sie eine Klasse ohne Mitglieder überhaupt kompilieren. „Fast leer“ scheint zu bedeuten, es sonst Vtable und nichts Hasa.

C ++ hat etwas eine „leere Basis Optimierung“ bezeichnet. Wenn eine Klasse keine Mitglieder hat, braucht es nicht Platz zu nehmen, wenn es als Basisklasse verwendet wird. Ein Beispiel dafür, warum dies wichtig ist std::unary_function<T, U>. Es gibt Ihnen eine einfache Reihe von typedefs bereitzustellen. Diese typedefs sollte nicht auf die Größe Ihrer Funktor Klasse beitragen.

Wenn Sie eine Basisklasse mit einem VTable-Zeigern haben, kann dieser Zeiger wahrscheinlich mit der abgeleiteten Klasse geteilt werden. Sie erstellen Sie einfach eine VTable für die abgeleitete Klasse, die nach dem von der Basisklasse seine eigenen Methoden ergänzt.

Sie können nun ein ähnliches „keine zusätzlichen Overhead“ Basisklasse erreichen. Offenbar GCC fordert, dass "fast leer".

Es hat nur einen Vtable, keine Datenfelder.

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