2015-07-29 6 views
11

Durante la lettura del codice sorgente di Roslyn on GitHub, ho notato la tanto usata classe ObjectPool<T>. Viene utilizzato per ridurre il sovraccarico della memoria.Perché roslyn avvolge oggetti nelle strutture quando vengono inseriti negli array?

Internamente utilizza an array per memorizzare gli oggetti raggruppati. Quello che non capisco è il motivo per cui utilizza una struttura privata denominata Element contenente un singolo campo di tipo T come elemento di matrice, invece di utilizzare semplicemente T.

Questo è motivo di preoccupazione per le prestazioni? Sovraccarico di memoria?

risposta

14

Potrebbe essere per motivi di prestazioni. Vedi this article by Jon Skeet.

Per riepilogare, gli array di tipo value sono invarianti in C#, il che significa che il runtime può evitare di eseguire un controllo di compatibilità durante la memorizzazione degli elementi nell'array. Nell'articolo, Mr. Skeet utilizza una struttura di wrapper simile a quella che hai descritto e mostra un miglioramento delle prestazioni di scrittura nell'array.

+0

Holy ..... non mi aspettavo questo, dovrebbe essere possibile dichiarare gli array come invarianti. Sarebbe molto più bello di questa soluzione alternativa. Ora ho bisogno di cambiare alcune cose nel mio motore di visualizzazione. : -/ –

+0

Dannazione ... Non lo sapevo. Domani scriverò sicuramente qualche codice: - \ –

+1

Ho pubblicato una [proposta di funzionalità] (https://github.com/dotnet/roslyn/issues/4211) sul [progetto Roslyn] (https: // github .com/dotnet/Roslyn). Ha lo scopo di rendere l'utilizzo di array invarianti un po 'più semplice. – Wazner

Problemi correlati