Quante informazioni vengono copiate/condivise quando assegno una variabile di matrice a un'altra variabile di matrice?Quante informazioni condividono le variabili di matrice?
int[] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
int[] b = a;
a[0] = 42;
writefln("%s %s", a[0], b[0]); // 42 42
A quanto pare, a
e b
condividono la stessa payload, perché 42 viene stampato due volte.
a ~= 10;
writefln("%s %s", a.length, b.length); // 11 10
Aggiunta di a
non cambia b
, quindi la lunghezza non sembra parte del carico utile?
b = a;
a ~= 11;
b ~= 42;
writefln("%s %s", a[11], b[11]); // 11 42
Potrebbe Un'implementazione conforme D anche stampare 42 42
? Potrebbe b ~= 42
sovrascrivere l'11 all'interno di a
?
Quando sono esattamente a
e staccati gli uni dagli altri? D sta eseguendo qualche COW in sottofondo?
Quindi non '~ =' avere sempre la complessità lineare? Avevo l'impressione che le ripetizioni invocanti di '~ =' avrebbero funzionato meglio del quadratico ... – fredoverflow
@FredOverflow: Sì, è lineare, anzi, se possibile, si aggiunge all'array originale, ma dal momento che il vecchio segmento "vede" solo la parte originale (attraverso la sua copia della lunghezza), quindi non vedrà che hai aggiunto nulla. – Mehrdad
Quindi '~ =' è efficiente solo se non avviene la condivisione? Ciò significa che 'b = a' modifica in qualche modo' a' sullo sfondo, giusto? – fredoverflow