Warum erhöhen Destruktoren in C ++ die Größe des Objekts, in dem sie sich befinden?

7

Ich weiß, dass es wie eine seltsame Frage klingen mag, aber ich habe mich nur gefragt, ob die Klasse in C ++ mehr Gewicht hat als eine Struktur mit denselben Datenfeldern, und da ist diese eine Sache, für die ich keine Antwort finden konnte ... < br> Bedenken Sie Folgendes:

%Vor%

Aber jetzt sehen, was passiert, wenn ich einen Destruktor zu SomeClass hinzufügen:

%Vor%

Warum benötigt SomeClass 8 weitere Bytes für den Destruktor?

    
so.very.tired 11.07.2014, 18:45
quelle

3 Antworten

17

Die Größenzunahme ist wegen virtual . Wenn Sie den Destruktor nicht virtuell machen, wird die Größe nicht größer.

Es ist also nicht der Destruktor, der Ihren Typ größer macht, sondern vielmehr eine virtuelle Funktion, die das tut.

Die 8 zusätzlichen Bytes sind ein Zeiger auf die virtuelle Tabelle ( vtable ) für die Klasse, die Sie verwenden. Wie in den Kommentaren erwähnt, ist dies eine "einmalige" Kosten. Hinzufügen einer virtuellen Funktion zu einer Klasse bringt diese Kosten, aber Sie sehen diese Kosten nicht mit zusätzlichen virtuellen Funktionen.

Bearbeiten:

Die zusätzliche Größe in der Klasse hängt davon ab, ob dies als 32-Bit- oder 64-Bit-Programm kompiliert wird. Die Verbindung zur virtuellen Tabelle benötigt 4 zusätzliche auf 32-Bit und 8 zusätzliche Bytes auf einer 64-Bit-Plattform.

    
Michael Gazonda 11.07.2014, 18:46
quelle
4

Es ist nicht die Tatsache, dass Sie einen Destruktor hinzugefügt haben. Es ist die Tatsache, dass Sie eine virtuelle Methode hinzugefügt haben (zusätzliche virtuelle Methoden würden keine zusätzlichen Kosten pro Instanz verursachen). Die meisten (alle?) C ++ - Implementierungen verwenden eine virtuelle Funktionszeigertabelle, um die dynamische Verteilung zu ermöglichen, und dies erfordert einen Zeiger auf die entsprechende Tabelle, die in jedem Objekt gespeichert werden soll. Diese Zeiger-zu-virtuelle-Tabelle ist der zusätzliche Speicherplatz pro Objekt, den Sie sehen.

    
Mark B 11.07.2014 18:48
quelle
0

Wenn Sie einen Destruktor als virtuell deklarieren, fügt der Compiler automatisch einen vtable-Zeiger als Mitglied in Ihre Klasse ein. Dies ist notwendig, damit es die Adresse aller Destruktoren der von Ihnen abgeleiteten Klassen finden kann.

Dieses neue Element (auf das Sie nicht trivial zugreifen können, sollten Sie auch nicht) wird in Ihre Klasse eingefügt und vergrößert sich dadurch um die Größe eines trivialen rohen Zeigers, der normalerweise die gleiche Größe wie ein int hat, aber von Ihnen abhängen kann Architektur.

    
Homero C. de Almeida 11.07.2014 18:52
quelle

Tags und Links