wenn es einen Leistungsvorteil für das Schreiben der eigenen swap () Funktion / Methode gibt

9

Angenommen, ich habe eine Klasse wie diese:

%Vor%

Wenn ich std::swap verwende, wird es wahrscheinlich so etwas tun:

%Vor%

Es wird "leeres" Objekt tmp unter Verwendung von Standard-C-Tor konstruiert - im Allgemeinen billige Operation. Dann bewegt es sich hoffentlich 3 mal, außer in verrückten Fällen, wenn Bewegung zum Kopieren verfallen ist.

Aber wenn ich meinen eigenen Tausch mache:

%Vor%

Es wird definitiv weniger Speicher verbrauchen, aber es muss immer noch eine leere std::string - 4 mal erstellt werden !!!

Ich könnte wild gehen und es mit einem einzigen std::string machen.

In allen Fällen sieht es nicht wie eine große Verbesserung aus.

Nur der richtige Fall, an den ich denken könnte, ist, wenn der Standard-C-Tor lächerlich teuer ist. Habe ich Recht?

    
Nick 24.09.2015, 09:11
quelle

3 Antworten

2

Nun, Sie können nicht sagen, dass Sie Ihre eigene swap erstellen müssen oder nie sollten, alles hängt vom Kontext ab. In Ihrem Beispiel ist es höchstwahrscheinlich unnötig, aber die Logik Ihrer Klasse könnte komplexer sein.

Nehmen wir an, Sie haben eine Klasse, die einen Zeiger auf eine Datenstruktur und viele mit dieser Struktur verknüpfte Metriken enthält, von denen jede eine lange Zeit für die Berechnung benötigt und viel Speicherplatz zum Speichern benötigt, sowie diese Metriken werden als Provisorien verwendet, wenn man einige Berechnungen über die Daten durchführt (ich weiß, dass das folgende Beispiel wahrscheinlich eine schlecht konstruierte Klasse ist, aber es sollte die Idee veranschaulichen):

%Vor%

Stellen Sie sich nun vor, dass Sie swap() zwei Instanzen dieser Klasse benötigen. Die einfachste Implementierung wird alles kopieren, einschließlich der alten Metriken, die in Wirklichkeit momentan nicht benötigt werden, da sie beim nächsten Aufruf von doSomeWork() sowieso überschrieben werden. In diesem Fall können Sie swap optimieren, indem Sie einfach den Zeiger auf die Datenstruktur setzen.

    
SingerOfTheFall 24.09.2015 09:36
quelle
2

Ich würde erwarten, dass eine sinnvolle std::swap(std::string&, std::string&) -Implementierung ohne irgendwelche Provisorien ausgetauscht wird. Es sollte nur in der Lage sein, Zeiger auszutauschen, obwohl ich einräume, dass die kleine Schnur-Optimierung einen Schlüssel in diesen bestimmten Arbeiten auf einigen Implementierungen werfen kann.

Sie könnten immer die std::string::swap -Memberfunktion verwenden, die Ich würde erwarten, dass noch mehr von solch einer entzückenden "Optimierung" Gebrauch macht . Ich meine, sonst, was ist der Sinn? :)

%Vor%

Sie müssen dieses trotzdem implementieren , auch wenn es nur ein Teil Ihres Move-Konstruktors ist. Andernfalls kann die Standardprozedur std::swap(A&, A&) nicht viel bewirken.

Zusammenfassend, ja, Sie sollten Ihre eigene swap -Funktion schreiben, und ja, Sie sollten sie verwenden, um die Standard-Swap-Funktionalität aufzurufen. Da Sie beide benötigen, gibt es keinen Leistungsvergleich zum Zeichnen.

    
quelle
0

Ein Fall, in dem die Implementierung der eigenen swap 1 Funktion von Vorteil ist, ist die Zuweisung / Zuweisung von dynamisch zugewiesenem Speicher in einem Zuweisungsoperator durch Verwendung von < em> kopiere und tausche Idiom .

Wenn Sie die folgende Klasse haben:

%Vor%

1. Implementieren des Zuweisungsoperators

anstelle von:

%Vor%

Sie könnten tun:

%Vor%

2. So tauschen Sie die Mitglieder einer Klasse sicher aus:

%Vor%

Hinweis: Einblicke in diese Antwort entlehnt von dies .

1 Eine Swap-Funktion ist eine nicht-werfende Funktion, die zwei Objekte einer Klasse, Mitglied für Mitglied, vertauscht. Wir könnten versucht sein, std::swap zu verwenden, anstatt unsere eigenen zu liefern, aber das wäre unmöglich; std::swap verwendet den Copy-Constructor- und Copy-Assignment-Operator innerhalb seiner Implementierung und wir würden letztendlich versuchen, den Zuweisungsoperator in Form von sich selbst zu definieren!

    
Ziezi 24.09.2015 09:47
quelle

Tags und Links