2015-09-05 5 views
9

Sono abbastanza nuovo per il problema di memoria. Spero che tu non pensi che questa sia una domanda stupida da chiedere.C# Oggetto di grandi dimensioni nella raccolta di medie dimensioni

so che di memoria più grande di 85.000 byte per essere messa in LOH in C# cioè

Byte[] hugeByteCollection = new Byte[85000]; 

mi chiedo se una collezione con dimensioni 10.000-20.000 con un oggetto che contiene 10 variabili membro (byte tipo) verrà inserito in LOH o SOH?

risposta

4

La dimensione di una matrice di oggetti è il numero di oggetti moltiplicato per la dimensione del puntatore. Questo perché solo i tipi di valore sono memorizzati nell'array stesso, i tipi di riferimento (oggetti) verranno memorizzati da qualche altra parte e non verranno conteggiati per le dimensioni dell'array. Quindi 85000/4 = 21250 oggetti e 85000/8 = 10625 oggetti possono essere memorizzati in un array sul SOH in modalità a 32 bit e 64 bit, rispettivamente.

Modifica: Grazie a Hans Passant per aver sottolineato che questo presuppone che il tipo di raccolta utilizzato sia un array e non un elenco. Le liste si ridimensionano per essere più grandi del contenuto per evitare troppe allocazioni. Vedi this link per dettagli

+1

Questo tipo di matematica non funziona per i tipi di raccolta, in realtà è 16.384. Controlla [questa risposta] (http://stackoverflow.com/a/2248188/17034) per i dettagli. –

+0

Grazie per il tuo commento! Il ridimensionamento di cui parli riguarda solo gli elenchi, non gli array, quindi non direttamente correlati a questa domanda. Tuttavia, avrei dovuto aggiungere l'avviso –

+0

in modo da mantenere l'elenco in SOH per l'elenco che contiene un numero elevato di oggetti Abbiamo bisogno di creare un elenco partizionato che contenga una serie di elenchi. Il partitionList crea dinamicamente un nuovo elenco e aggiunto all'arry quando l'elenco supera la capacità di 10000 Funzionerà? – cscmh99