Capacità predefinita dell’elenco

Qual è la capacità predefinita di un elenco?

Perché non lo provi?

Console.WriteLine("Default capacity of a List: " + new List().Capacity); 

Questa risposta funzionerà su tutte le versioni di .NET che hanno List. Sulla mia versione, capita di essere 0.

In realtà, inizia con una capacità di 0. Quando aggiungi il primo elemento, l’implementazione corrente alloca una capacità di 4. Dopo di ciò, la capacità continua a raddoppiare se è necessaria l’espansione, per garantire l’operazione O (1) ammortizzata.

Tieni presente che questo è il comportamento corrente. Non si dovrebbe fare affidamento su di esso per essere il caso. Questo dovrebbe dimostrare il comportamento corrente:

 List list = new List(); int capacity = list.Capacity; Console.WriteLine("Capacity: " + capacity); for (int i = 0; i < 100000; i++) { list.Add(i); if (list.Capacity > capacity) { capacity = list.Capacity; Console.WriteLine("Capacity: " + capacity); } } 

In base all’esempio sulla documentazione del costruttore senza parametri MSDN , la capacità iniziale di un elenco creato con:

 List x = new List(); 

è 0. Per quanto posso dire, questo non è documentato come garanzia, né la politica di ridimensionamento è documentata (cioè potrebbe attualmente raddoppiare con un minimo di 4, ma in .NET 5.0 potrebbe triplicare con un minimo di 128 .) Non dovresti fare affidamento su questo comportamento, in pratica.

La capacità predefinita di Elenco è di 4 elementi (dopo aver inserito un elemento iniziale, altrimenti è di dimensione 0)

 var list = new List(); list.Add(1); Assert.AreEqual(4, list.Capacity); 

La capacità dovrebbe essere utilizzata se si conosce approssimativamente il numero di elementi che si desidera archiviare in Elenco (o in Stack o in coda).

In questo caso eviterai di copiare la memoria. La copia della memoria avviene perché sotto gli elenchi delle casse (stack e code) si fa affidamento sulla matrice per memorizzare i propri oggetti. Quella dimensione dell’array è la tua capacità, ma non è la stessa della dimensione dell’elenco. Poiché la dimensione dell’elenco deve essere maggiore della dimensione dell’array, l’implementazione List assegnerà un array più grande (fattore 2 forse inferiore) e copierà tutti gli elementi dal vecchio array a quello nuovo più gli elementi aggiunti di recente.

Quindi, se sai che puoi avere da, diciamo, da 50 a 60 elementi nel tuo elenco, crea un elenco con capacità 60 e non accadrà alcuna deallocazione di memoria.

Nota: sembra che Garbage Collector non debba ripulire vecchi array

Tutto ciò si trova in una riga per garantire che la capacità sia in grado di memorizzare un altro elemento:

 int num = this._items.Length == 0 ? 4 : this._items.Length * 2; 

Ottenuto dal mscorlib 4.0.0.0 deassebled – ovviamente, come ha detto Jon, non si può garantire che questo non cambi in futuro (fino ad ora rimane a 0, 4, 8, 16 …).

Ovviamente, puoi impostarlo da solo in modo che questo possa essere 3, 9, 27, ecc.