Parameter "size" des Elementoperators new [] erhöht sich, wenn die Klasse destructor / delete [] hat

8

4 Klassen in den folgenden Codes: A, B, C und D.

Sie haben alle ein Mitglied operator new[] .

Außerdem

  • B hat einen Konstruktor;
  • C hat einen Destruktor;
  • D hat ein Mitglied operator delete[] .

Der Parameter size des Mitglieds operator new[] und der sizeof der 4 Klassen werden ausgegeben:

%Vor%

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

%Vor%

g++ -v

%Vor%     
chaosink 20.08.2017, 11:35
quelle

1 Antwort

8

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:

%Vor%

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;)

    
Holt 20.08.2017, 12:53
quelle