Ist
%Vor%Genau so schnell wie
%Vor%?
Ich kümmere mich nicht um kleine Gemeinkosten wie Extra-Funktionsaufrufe usw., der Compiler wird das Zeug inline.
Der Grund, warum ich frage, ist, weil ich Code wie den folgenden habe:
%Vor%last_it ist normalerweise der Enditerator, aber nicht immer. Ich weiß, dass das Löschen eines Vektors nicht vom Ende her Kosten verursacht, weil später Elemente im Vektor nach unten kopiert werden müssen. In dem Fall, in dem last_it nicht der Enditerator ist (selten), kann ich damit leben. Aber ich möchte keinen solchen Overhead einführen, wenn ich den Vektor im Grunde löschen möchte. Also überlegte ich, meinen Code so zu schreiben:
%Vor%Ich würde gerne wissen, ob dies notwendig ist, um eine Leistungseinbuße zum Löschen des gesamten Vektors zu vermeiden. Ich würde es vorziehen, meinen Code klar zu halten und eine einzeilige Anweisung zu verwenden, wenn es keine Strafe gibt.
Machen Sie sich darüber keine Sorgen und schreiben Sie den offensichtlichen Code mit erase
. Wenn Sie bis zum Ende löschen, gibt es keine Elemente mehr, die nach unten verschoben werden können, daher sollte es einen minimalen Leistungsunterschied zwischen den beiden geben, falls vorhanden.
Blick in den Quellcode des Vektors (siehe Visual Studio 2012 (Code-Ausschnitt unten) oder SGI (Zeile 434) eins), clear
ist definiert als:
Also ich denke ja.
In Ihrem Fall würde ich die if-Anweisung nicht verwenden und einfach tun:
%Vor%Das Problem ist, dass es keine einzige Antwort auf Ihre Frage gibt, da es keine einzige Implementierung der C ++ - Standardbibliothek gibt, die auf allen Plattformen verwendet wird. Das einzige, was durch den Standard spezifiziert wird, ist die algorithmische Komplexität der Löschoperation. Insbesondere kann es eine konstante Zeit für trivial zerstörbare Typen sein; Bei Arten, die zerstört werden müssen, ist die Anzahl der Zerstörungen linear. Das ist die einzige Garantie, die Sie vom C ++ Standard erhalten.
Die Standardbibliothek wird normalerweise als Teil Ihrer Compiler-Installation verteilt, so dass genaue Implementierungsdetails wie diese sehr wohl von Compiler zu Compiler variieren können. Wenn Sie sich nur mit einer einzelnen Compiler-Version beschäftigen, können Sie eine Antwort finden, aber erkennen Sie, dass sie sich ändern kann, wenn Sie Plattformen wechseln.