Wann findet das Kopieren für schnelle Werttypen statt?

8

Wenn Sie in Swift einen Werttyp übergeben, sagen Sie ein Array zu einer Funktion. Eine Kopie des Arrays wird für die zu verwendende Funktion erstellt.

Die Dokumentation unter Ссылка sagt auch:

  

Die obige Beschreibung bezieht sich auf das "Kopieren" von Strings, Arrays und   Wörterbücher. Das Verhalten, das Sie in Ihrem Code sehen, ist immer so, als ob a   Kopie fand statt. Swift führt jedoch nur eine tatsächliche Kopie nach   die Szenen, wenn es unbedingt notwendig ist. Swift schafft alles   Wertkopieren, um eine optimale Leistung sicherzustellen, und Sie sollten nicht vermeiden   Zuweisung, um zu versuchen, diese Optimierung zu verhindern.

Bedeutet das, dass das Kopieren tatsächlich nur stattfindet, wenn der übergebene Werttyp geändert wird?

Gibt es eine Möglichkeit zu zeigen, dass dies tatsächlich das zugrunde liegende Verhalten ist?

Warum ist das wichtig? Wenn ich ein großes unveränderliches Array erstelle und es von Funktion zu Funktion weitergeben möchte, möchte ich sicher keine Kopien davon machen. Sollte ich in diesem Fall nur NSArrray verwenden oder würde das Swift Array funktionieren, solange ich nicht versuche, das übergebene Array zu manipulieren?

Nun, solange ich die Variablen in der Funktion nicht explizit mit var oder inout editierbar macht, kann die Funktion das Array trotzdem nicht modifizieren. Also macht es immer noch eine Kopie? Zugegeben, dass ein anderer Thread das ursprüngliche Array an anderer Stelle modifizieren kann (nur wenn es veränderbar ist), eine Kopie in dem Moment zu machen, in dem die Funktion als notwendig bezeichnet wird (aber nur wenn das übergebene Array veränderbar ist). Wenn also das ursprüngliche Array unveränderlich ist und die Funktion nicht var oder inout verwendet, ist es in Swift sinnlos, eine Kopie zu erstellen. Recht? Was meint Apple mit dem obigen Satz?

    
Barka 27.10.2014, 18:07
quelle

1 Antwort

0

Ich weiß nicht, ob das für jeden Werttyp in Swift gleich ist, aber für Array s bin ich ziemlich sicher, dass es sich um eine Kopie beim Schreiben handelt, also kopiert es es nur, wenn du es änderst, und wie Sie gesagt haben, wenn Sie es als Konstante weitergeben, laufen Sie dieses Risiko sowieso nicht aus.

ps. In Swift 1.2 gibt es neue APIs, mit denen Sie Copy-on-Write auch auf Ihren eigenen Werttypen implementieren können

    
DeFrenZ 04.03.2015 17:57
quelle

Tags und Links