Der Operator delete überprüft sich selbst, wenn der Zeiger nullptr ist. Gibt es einen Performance-Overhead beim Aufrufen von delete auf einem nullptr, ohne es selbst zu überprüfen?
%Vor%oder
%Vor%Welche der obigen Ausführungen wird schneller ausgeführt, wenn ptr nullptr ist?
Wie immer kommt es auf den Compiler an.
Ich benutze MSVC, das beide Zeilen zu genau demselben Code kompiliert.
Die Regeln sagen, dass wenn der Zeiger Null ist, das Löschen keine Wirkung hat. Also, wenn Sie das nicht überprüfen, muss der Compiler sowieso.
Dies ist definitiv ein Fall von Überoptimierung. Auf jedem modernen Prozessor beträgt der Unterschied einige Nanosekunden.
Durch die Überprüfung vermeidet der Code den Overhead eines Aufrufs (zur Löschbibliotheksroutine). In 99% der Fälle ist die leichte zusätzliche Komplexität des Quellcodes (geschweifte Klammern, potentielles Tippfehler !=
, etc.) eher ein Problem als die zusätzliche Ausführungszeit.
Nein, es gibt keinen Overhead, wenn Sie nicht überprüfen, ob ptr
nullptr
ist.
Wenn Sie manuell eine Prüfung durchführen, wird die gleiche Prüfung zweimal durchgeführt, obwohl dies vernachlässigbar ist, verglichen mit den Kosten des Systemaufrufs, könnten Sie erwarten, dass ptr
nicht null ist.
Welche der obigen Ausführungen wird schneller ausgeführt, wenn ptr nullptr ist?
Angenommen, Ihr Check wird nicht optimiert, der oberste wäre schneller. Wenn es weg optimiert wird, wäre keiner schneller. Überlassen Sie es dem Compiler.
Tags und Links c++