Uno dei motivi per cui le strutture possono essere più performanti delle classi è che non è necessario ARC per le strutture. Ma supponiamo di avere la seguente struttura in swift:
struct Point {
var x:Float
var y:Float
mutating func scale(_ a:Float){
x *= a
y *= a
}
}
var p1 = Point(x:1, y:1)
var p2 = p1 //p1 and p2 point to the same data internally
p1.scale(2) //copy on mutate, p1 and p2 now have distinct copies
Ora credo che varie copie di una struttura puntino effettivamente agli stessi dati nello stack finché una mutazione non forza una copia. Ciò significa che dobbiamo tenere traccia del numero di oggetti che fanno riferimento a un dato indirizzo di memoria nello stack in modo da sapere se una mutazione deve formare una copia, o semplicemente formiamo una copia su ogni mutazione. Il primo sembra inefficiente e il secondo sembra identico a ARC. Cosa mi manca?
EDIT: Capisco la differenza tra semantica del valore e semantica di riferimento. Ma come una rapida ottimizzazione non crea una nuova copia dei dati fino a quando non viene effettuata una mutazione. Questo evita copie non necessarie. Vedi link . Ma per questo non sono sicuro di come possano evitare una qualche forma di ARC. Ho notato che questo articolo afferma che la copia su scrittura è fatta solo per array e dizionari. Non sono sicuro che sia vero, ma se così fosse, le mie domande rimarranno gli array.