Shared Memory und kopieren auf Write oder Rvalue Referenzen und verschieben Semantik?

8

Ist ein shared memory / copy bei der Schreibimplementierung für allgemeine Container (wie in den Containern von Qt) durch C ++ 11 move semantics und rvalue references ersetzt?

Wo scheitert einer und der andere gelingt? Oder ergänzen sie sich eher als Alternativen?

    
rubenvb 18.04.2013, 20:08
quelle

2 Antworten

7

Sowohl die Kopie als auch die Verschiebungssemantik wurden verwendet, um die Wertesemantik von Objekten zu optimieren, die ihre Daten auf dem Heap speichern. std::string wurde zum Beispiel sowohl als Objekt zum Kopieren als auch zum Verschieben als Objekt implementiert.

Die Kopie-auf-Schreib- und Verschiebungssemantik ist in dieser Hinsicht ähnlich: Sie können beide verwendet werden, um "Kopien" zu optimieren, wenn Sie "kopieren" nur unzureichend definieren. Ich habe manchmal Bewegungssemantik als Kopie-beim-Schreiben beschrieben, wobei der Referenzzähler auf 0 oder 1 begrenzt ist, und somit das Feld, das den Referenzzähler enthält, weg optimiert ist.

Alle Container in der std :: lib verwenden jetzt move semantics und sogar std::string , das früher Copy-on-Write verwenden durfte, ist nun verboten. Wenn ich heute einen neuen Kundencontainer schreibe, würde ich move-Semantik verwenden, bevor ich Copy-on-Write auswähle.

Es gibt noch eine Verwendung für das Kopieren in C ++ 11. Wenn Sie erwarten, dass Ihre Datenstruktur selten geschrieben wird, aber häufig kopiert wird und viele Clients Kopien desselben Werts enthalten, kann Copy-on-Write dennoch ein großer Gewinn sein.

Zum Beispiel habe ich gesehen, dass Copy-on-Write gut dazu geeignet ist, eine Undo-Liste für ein komplexes Dokument zu halten. Bei jedem Commit (wo Sie den Status speichern möchten) hat sich seit dem letzten Commit nur ein kleiner Teil des großen Dokuments geändert. Wenn Sie also eine Kopie des Dokuments erstellen, um seinen Status zu speichern, müssen Sie eine Reihe von Referenzzählungen aktualisieren und tatsächlich Änderungen an einem kleinen Stück vornehmen (Kopie-auf-Schreib-Format).

    
Howard Hinnant 18.04.2013, 21:52
quelle
6

Kopieren-beim-Schreiben und Verschieben-Semantik sind völlig unterschiedliche Konzepte, von denen jedes einem anderen Zweck dient. Während es einen häufigen Anwendungsfall gibt: Rückgabe eines Objekts aus einer Funktion, in der , weil das Original den Gültigkeitsbereich verlässt , ist es effektiv eine Verschiebung, im allgemeinen Fall unterscheiden sie sich:

Mit copy on write können mehrere Objekte, die gleichzeitig aktiv sind, den Inhalt teilen . Bei der Bewegungssemantik hat nur ein Objekt den Inhalt zu einem bestimmten Zeitpunkt.

Ein bisschen orthogonal dazu, Copy-on-Write hat Probleme in Multithread-Umgebungen, da potentiell mehrere Objekte auf dieselben Daten (nur Lesen) und Steuerblöcke (Lesen / Schreiben) zugreifen können, die in a verwaltet werden müssen Thread-sichere Art.

    
quelle