Zum Beispiel habe ich zwei String-Objekte: string str_1, str_2. Ich möchte mit ihnen verketten. Ich kann zwei Methoden verwenden: Methode 1:
%Vor%Methode 2:
%Vor%Da der Puffer der Zeichenfolge schreibgeschützt ist, wird der Puffer beim Ändern des Zeichenfolgenobjekts zerstört und ein neuer erstellt, um neuen Inhalt zu speichern. Also Methode 1 ist besser als Methode 2? Ist mein Verständnis richtig?
stringstreams
sind komplexe Objekte im Vergleich zu einfachen Strings. Immer wenn Sie Methode 1 verwenden, muss ein stringstream
erstellt und später zerstört werden. Wenn Sie dies Millionen von Zeit tun, wird der Overhead nicht vernachlässigbar sein.
Das scheinbar einfache ss << str_1 << str_2
ist tatsächlich äquivalent zu std::operator<<(sst::operator<<(ss, str_1), str_2);
, das nicht für die Speicherverkettung optimiert ist, sondern für alle Streams .
Ich habe einen kleinen Benchmark gemacht:
Im Debug-Modus ist Methode 2 fast doppelt so schnell wie Methode1.
In optimiertem Build (Überprüfung in der Assembler-Datei, dass nichts weg optimiert wurde), ist es mehr als 27-mal schneller.