Qt 4.5 - QList :: QList (const QList &) - Ist das ein Deep Copy Konstruktor?

8

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?

    
Extrakun 14.08.2009, 10:22
quelle

4 Antworten

5

Es ist eine flache Kopie. Eine tiefe Kopie der Daten geschieht hinter den Kulissen, wenn Sie zum ersten Mal eine nicht-konstante Funktion auf der Kopie oder der ursprünglichen Liste aufrufen.

    
rohanpm 14.08.2009, 11:22
quelle
3
  

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.

    
Matthieu 14.08.2009 11:44
quelle
2

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.

    
Thomi 14.08.2009 11:52
quelle
-2

AFAIK, wenn der Inhalt (beim Schreiben) kopiert wird, ruft er den Kopierkonstruktor jedes Elements in der Liste auf, wie im Falle von std :: list.

    
Cătălin Pitiș 14.08.2009 10:47
quelle

Tags und Links