Ich bin verwirrt über den QList-Kopierkonstruktor durch die Dokumentation.
QList :: QList (const QList & andere) Konstruiert eine Kopie von anderen.
Diese Operation benötigt konstante Zeit, weil QList implizit geteilt wird. Dies macht das Zurückgeben einer QList von a Funktion sehr schnell. Wenn eine geteilte Instanz wird geändert, wird es sein kopiert (copy-on-write), und das dauert lineare Zeit.
Dann auf dem Link über implizit geteilt werden, spricht es über Referenzzählung und Copy-on-Write. Ist das eine tiefe Kopie oder nur eine oberflächliche Kopie?
Diese Operation benötigt konstante Zeit, weil QList implizit freigegeben ist.
Wenn Sie die Liste nicht ändern, werden diese geteilt! Also hinter der Szene lesen Sie unter der gleichen Adresse die Informationen!
Wenn eine gemeinsam genutzte Instanz geändert wird, wird kopiert (copy-on-write), und das braucht lineare Zeit.
Aber wenn Sie die Kopierliste ändern, gibt es keine andere Möglichkeit, die Liste effektiv zu kopieren! Und so haben Sie eine lineare Kosten abhängig von der Listengröße.
von qt doc auf Kopie beim Schreiben und gemeinsam genutzten Speicher:
Eine tiefe Kopie impliziert das Duplizieren eines Objekt. Eine flache Kopie ist eine Referenz Kopie, d.h. nur ein Zeiger auf eine gemeinsame Datenblock. Eine tiefe Kopie zu machen kann sein teuer in Bezug auf Speicher und CPU. Eine flache Kopie zu erstellen ist sehr schnell, weil es nur das Setzen eines enthält Zeiger und Inkrementieren der Referenz zählen.
Wenn Sie also die Liste nicht ändern, lesen Sie die Informationen an der gleichen Adresse wie die Liste, die als Parameter angegeben wurde. Und wenn Sie es ändern, haben Sie eine tiefe Kopie der Liste.
Der Kopierkonstruktor führt eine schnelle (flache) Kopie durch. Wenn Sie dann entweder die ursprüngliche Liste oder ihre Kopie ändern, wird eine tiefe Kopie der Daten erstellt.
Wenn Sie irgendwelche Zweifel haben, schlage ich vor, dass Sie die Dokumetation in der Copy-on-Write-Semantik noch einmal lesen.
Dies ist das gleiche Verhalten wie QString, QList, QArray und viele andere Qt-Klassen.
AFAIK, wenn der Inhalt (beim Schreiben) kopiert wird, ruft er den Kopierkonstruktor jedes Elements in der Liste auf, wie im Falle von std :: list.