C++ virtual function table Speicher Kosten

Betrachten:

class A
{
    public:
        virtual void update() = 0;
}

class B : public A
{
    public:
        void update() { /* stuff goes in here... */ }

    private:
        double a, b, c;
}

class C { 
  //Same kind of thing as B, but with different update function/data members
}

Ich bin jetzt dabei:

A * array = new A[1000];
array[0] = new B();
array[1] = new C();
//etc., etc.

Wenn ich den Anruf sizeof(B) die zurückgegebene Größe ist die benötigte Größe von den 3 Doppel-Mitglieder, plus einige overhead erforderlich für die virtual function pointer table. Nun, zurück zu meinem code, es stellt sich heraus, dass 'sizeof(myclass)" 32; das heißt, ich bin mit 24 bytes für meine Mitglieder-Daten und 8 bytes für die virtual-function-table (4 virtuelle Funktionen). Meine Frage ist: gibt es eine Möglichkeit, kann ich optimieren? Mein Programm wird letztendlich auch verdammt viel Speicher, und ich weiß nicht wie der Klang von 25%, es wird gegessen, virtuelle Funktionen, Zeiger.

Vergessen Sie nicht-virtuellen Destruktoren.
Suchen Sie in Ihrer Strategie, sollten Sie vielleicht besser untersuchen mithilfe einer benutzerdefinierten Zuweisung von jedem B, C usw. Mit einer grundlegenden new für eine große Zahl von einzelnen Objekten Hinzugefügt werden kann mehr Aufwand als Sie zu realisieren.
Wie die Antworten notiert, Sie zahlen nur einen pointer pro Instanz (4 bytes auf x86 und 8 bytes auf 64). Jedoch, memory-Ausrichtung ändern kann, das Bild ein wenig (zum Beispiel, wenn Sie eine Klasse mit einem char und virtuelle Methode, es dauert in der Regel 8 bytes auf x86). Auch die Microsoft C++ - Compilers hat den bekannten Fehler mit dem ausrichten der vfptr, die hinzufügen können, die 4 oder so bytes, um die Klassengröße.
Sie sollten auch Bedenken, dass da eine neue generische könnte befassen sich mit viele Arten von Objekten zuordnen können MEHR, sizeof erfordert...

InformationsquelleAutor Stewart | 2009-10-26

Schreibe einen Kommentar