4 Klassen in den folgenden Codes: A, B, C und D.
Sie haben alle ein Mitglied operator new[]
.
Außerdem
operator delete[]
. Der Parameter size
des Mitglieds operator new[]
und der sizeof
der 4 Klassen werden ausgegeben:
Was ist der Grund für die Unterschiede von size
?
Codes (hässlich, ich weiß):
%Vor%Über Betriebssystem und Compiler:
Kompilieren: gleiche Ergebnisse für clang ++ und g ++
%Vor%Betriebssystem: Linux Mint 18,2 Cinnamon 64-bit
Compiler:
clang++ -v
g++ -v
Diese zusätzlichen 8 Bytes werden verwendet, um Informationen darüber zu speichern, was zugewiesen wurde, um Objekte korrekt zu zerstören (das Programm muss wissen, wie viele Objekte zerstört werden müssen) und T::operator delete[]
mit dem korrekten zweiten Parameter aufzurufen. Entsprechend der generierten Assembly (siehe Ende dieser Antwort) ist der gespeicherte Wert die Anzahl der Elemente (hier 10
).
Grundsätzlich:
für A
und B
, der Destruktor ist ein No-Op, es ist also nicht notwendig zu wissen, wie viele Elemente zerstört werden müssen, und Sie haben kein benutzerdefiniertes delete[]
, so wird der Compiler den Standard verwenden, der sich scheinbar nicht um den zweiten Parameter kümmert;
für C
, der Destruktor wird verwendet, also muss er aufgerufen werden (ich weiß nicht, warum das nicht optimiert ist ...), also muss das Programm wissen, wie viele Objekte sein werden zerstört;
für D
, Sie haben eine benutzerdefinierte D::operator delete[]
, daher muss sich das Programm die zugewiesene Größe merken, um es bei Bedarf an D::operator delete[]
zu senden.
Wenn Sie das Attribut int
durch einen Typ mit einem nicht-trivialen Destruktor ersetzen (z. B. std::vector<int>
), werden Sie diese 8 Bytes sowohl für A
als auch für B
bemerken.
Sie können sich die generierte Assembly für C
(g ++ 7.2, keine Optimierung) ansehen:
Wenn Sie nicht mit der Assembly vertraut sind, hier ist eine arrangierte C ++ - Version dessen, was unter der Haube passiert:
%Vor%Nun sind Sie froh zu wissen, dass der Compiler das alles für Sie erledigt;)
Tags und Links c++ new-operator destructor delete-operator