Qual è la lunghezza massima di un array in .NET su Windows a 64 bit

Ho sentito da qualcuno che la dimensione massima dell’array in .NET è 4 GB? Mi chiedo solo se sia vero. Non ti sognerebbe di farlo su .NET a 32 bit, ma su un sistema a 64 bit con 12 GB di RAM, forse, forse potresti volerlo fare. 🙂

Un array potrebbe teoricamente contenere al massimo 2.147.483.647 elementi, poiché utilizza un indice per l’indicizzazione. Il limite effettivo è leggermente inferiore a questo, a seconda del tipo contenuto all’interno dell’array.

Tuttavia, esiste un limite massimo di oggetti singoli di 2 GB nel CLR .NET, anche a 64 bit. Questo è stato fatto dal design .

Si può facilmente realizzare un’implementazione di IList che, internamente, mantiene più array e consente di superare il limite del singolo object da 2 GB, ma non ce n’è uno nel framework stesso.

In genere, tuttavia, questo non è un problema reale. La maggior parte delle volte, avrai array che puntano a grandi classi, quindi l’array contiene solo riferimenti. Ciò significherebbe che il tuo array può effettivamente puntare a molti, molti GB di memoria – ma l’array stesso non può essere> 2 GB.


Si noti che, a partire da .NET 4.5, è disponibile una nuova opzione in cui le applicazioni a 64 bit possono triggersre: gcAllowVeryLargeObjects . Con questo nuovo set di opzioni, è ansible ottenere elementi UInt32.MaxValue ( UInt32.MaxValue ) in un array multidimensionale, sebbene un array a dimensione singola sia ancora limitato a 2.146.435.071 elementi (2.147.483.591 per array di byte singoli o matrici di una struttura che non contiene nulla un byte).

Le nuove regole con questa opzione sono:

  • Il numero massimo di elementi in una matrice è UInt32.MaxValue.
  • L’indice massimo in una singola dimensione è 2.147.483.591 (0x7FFFFFC7) per matrici di byte e matrici di strutture a byte singolo e 2.146.435.071 (0X7FEFFFFF) per altri tipi.
  • La dimensione massima per le stringhe e altri oggetti non array è invariata.

Nelle versioni di .NET precedenti alla 4.5, la dimensione massima dell’object è 2 GB. Dalla 4.5 in poi è ansible allocare oggetti più grandi se gcAllowVeryLargeObjects è abilitato. Si noti che il limite per la string non è influenzato, ma gli “array” dovrebbero coprire anche “liste”, poiché gli elenchi sono supportati dagli array.

La dimensione massima di qualsiasi object in .NET è 2 GB.

Questo, naturalmente, pone un limite all’ampiezza della capacità di creare un array raw.

Puoi creare una “serie di array” (e persino creare il tuo indicizzatore per accedervi come se fosse un array contiguo) abbastanza grande quanto vuoi se definisci la tua class per esso.