2015-01-07 13 views
5

Capisco array.count (il numero di elementi nell'array). Il conteggio è utile per scorrere gli elementi dell'array. I sorta di ottenere il senso di array.capacitySwift array.capacity vs array.count

capacity Un valore intero che rappresenta il numero di elementi totali dell'array possono memorizzare senza riallocazione (sola lettura).

Esperimento

Ho giocato con il parco giochi e notato la capacità di un array è un numero pari (incrementato di 2)

var arr = [1, 2, 3 , 4, 5, 6, 7] 
arr.removeLast() // capacity stays the same after a removal 
println(arr.capacity) // 8 
println(arr.count) // 6 

var arr = [1, 2, 3 , 4, 5, 6] 
arr.removeLast() 
println(arr.capacity) // 6 
println(arr.count) // 5 

La domanda

Cosa è l'uso di una capacità di array? Per favore, dare un esempio concreto?

+0

Afaik è solo un modo per preallocare lo spazio di memoria. Sarai in grado di scoprirlo con una ricerca su Google però. Non proprio una domanda SO. Inoltre, perché hai bisogno di sapere? Il conteggio non è abbastanza buono? – Fogmeister

risposta

14

La capacità di un array, in particolare il metodo reserveCapacity, consente di preallocare lo spazio nell'array.

Se si aggiungono elementi a un array e si supera la capacità, l'array deve aumentare la sua capacità. Poiché un array Swift memorizza i suoi elementi in modo contiguo nella memoria, deve riallocare la sua memoria interna e (di solito) copiare tutti i suoi elementi dalla vecchia memoria alla nuova memoria. (Si noti che NSArray non è documentato per archiviare i propri elementi contigui, ma possiamo dedurre che Array Swift probabilmente non basata sull'esistenza del metodo withUnsafeMutableBufferPointer.)

Se si conosce in anticipo quanti elementi si intende aggiungere all'array, è possibile utilizzare il metodo reserveCapacity per preimpostare la capacità dell'array in modo che non sia necessario eseguire alcuna riallocazione (e la copia associata).

L'unico motivo per cui posso pensare di chiedere a un array la sua capacità è di scoprire come funziona il sistema e di eseguire il debug di un problema di prestazioni.

Generalmente non è necessario preoccuparsi di riservare la capacità. Raramente una riallocazione è un problema di prestazioni. Swift utilizza (credo) un efficiente piano di riallocazione in modo che il numero di riallocazioni sia logaritmico nel conteggio finale dell'array. Per esempio. se aggiungi un milione di elementi uno alla volta, Swift non deve eseguire più di 20-30 riallocazioni.

Ma se si sa che l'array sarà molto grande (ad esempio, gigabyte su un Mac o decine di megabyte su un dispositivo iOS) o se si sta riempiendo l'array in un percorso di codice sensibile alle prestazioni (ad esempio, riempiendo un audio buffer che inizierà a suonare entro microsecondi), potresti voler riservare capacità ed evitare riallocazioni.

Probabilmente non dovresti preoccuparti di riservare capacità se non sai che le riallocazioni sono un problema, sia perché il profiler mostra che sono un collo di bottiglia o perché hai altre prove (come glitch audio nell'esempio del buffer audio).

4

Qual è l'uso di una capacità matrice

Fondamentalmente, la capacità dell'array ha senza uso esterno. È lì per l'uso interno di Swift. Se sai che assegnerai 100 oggetti a questo array, tu potresti impostare la capacità in anticipo mentre crei l'array, e ho visto alcune persone farlo nel loro codice; ma non c'è alcun particolare necessario per farlo e nessun particolare guadagna nel farlo. Hai guardato sotto il cofano e hai visto qualcosa che non avevi davvero bisogno di vedere. Ora che hai visto, puoi dimenticartene.

+0

"Ora che hai visto, puoi dimenticartene." :) Puoi dare un esempio di come può essere utile per uso esterno? –

+0

@raychenon perché? Con gli sviluppatori NSArray di Apple specificamente scoraggiati usando arrayWithCapacity e lasciando che tutto funzioni da solo. Perché hai bisogno di un esempio di come usare qualcosa che probabilmente non dovresti mai usare? – Fogmeister

+0

@Fogmeister perché qualcuno non ha ancora dimostrato come la capacità possa essere utile. Solo una domanda prima di dormire :) –