Wenn Sie C++ std :: maps (und andere Container) mit Werttypen verwenden, werden Sie feststellen, dass das Einfügen in die Map den Destruktor für Ihren Elementtyp aufruft. Dies liegt daran, die Umsetzung des Operators [] durch die C++ Spezifikation erforderlich ist äquivalent dazu sein:Warum verwendet C++ std :: map :: operator [] nicht inplace new?
(*((std::map<>::insert(std::make_pair(x, T()))).first)).second
Er ruft den Standardkonstruktor Ihrer Art, um das Paar zu bauen. Dieser temporäre Wert wird dann in die Karte kopiert und dann zerstört. Bestätigung davon kann in this stackoverflow post und here on codeguru gefunden werden.
Was ich seltsam finde ist, dass dies ohne die temporäre Variable implementiert werden könnte und immer noch gleichwertig ist. Es gibt eine Funktion von C++, die "inplace new" genannt wird. Die std :: map und andere Container können leeren Speicherplatz für das Objekt zuweisen und dann explizit den Standardkonstruktor des Elements für den zugewiesenen Speicherplatz aufrufen.
Meine Frage: Warum keine der Implementierungen von std :: map, die ich gesehen habe, inplace new verwenden, um diese Operation zu optimieren? Es scheint mir, dass es die Leistung dieser Low-Level-Operation erheblich verbessern würde. Aber viele Augen haben die STL-Code-Basis studiert, also denke ich, dass es einen Grund geben muss, warum es so gemacht wird.
Der Testfall ist im verknüpften Stackoverflow-Post enthalten. Hier ist der Link wieder: https://stackoverflow.com/questions/4017892/in-an-stl-map-of-structs-why-does-the-operator- cause-the-structs-dtor-to – srm
Mike Seymour: Sie schlagen also vor, dass bei ausgeschaltetem Debugger diese zusätzlichen Aufrufe an den Destruktor wegfallen würden? Weißt du, dass das wahr ist? Selbst wenn es wahr ist, heißt das, dass die Ausführung beim Debugging schwieriger zu debuggen ist (ich kann nicht einfach einen Breakpoint in meinem Debugger setzen, der nach "echten" Problemen sucht). Es ist auch weniger leistungsfähig während des Debuggens, was ein geringeres Problem ist, aber immer noch real. Beide Gründe scheinen mir Gründe dafür zu sein, anstelle einer solchen Low-Level-Bibliothek das Inplace New zu verwenden. – srm