2013-09-16 13 views
9

Tutti sanno che in .Net oggetti String quadro vengono memorizzati direttamente nella memoria heapString piscina Constant Memory in C#

Sto solo cercando di capire se c'è qualche memoria riservata nel framework .Net per archi. In java esiste una memoria riservata per le stringhe chiamata SCMP (String Constant Memory Pool) in cui le stringhe vengono inizializzate e le spazzature vengono raccolte come tutti gli altri oggetti nella memoria heap.

+1

Penso che Java abbia una funzionalità simile perché in passato disponevamo di dispositivi mobili con memoria limitata. Ora non abbiamo bisogno di una funzione del genere. è molto più semplice per il compilatore e il garbage collector. –

+0

correlati http://stackoverflow.com/questions/372547/where-do-java-and-net-string-literals-reside/372559#372559 –

risposta

2

In .NET le stringhe letterali sono "internate" in modo che sia presente una sola copia di ogni stringa letterale.

Vedi http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

+0

Questa risposta è fuorviante. * Le stringhe * letterali sono internate. Le stringhe generate dinamicamente sono allocate nell'heap come oggetti ordinari e non sono necessariamente univoci. Esempio rapido: 'Object.ReferenceEquals (" abc "," ABC ".ToLowerInvariant())' valuta come 'false', poiché solo la prima stringa è internata. – Douglas

+0

@Douglas - Nessuna intenzione di indurre in errore. La risposta dice che c'è una copia di ogni stringa * letterale *. Il riferimento MSDN citato rende molto chiaro che le stringhe costruite in modo programmato non sono internate, a meno che non si forzino specificamente ad essere internate usando il metodo 'String.Intern'. –

+1

Inoltre, solo perché una stringa è internata non significa che la memoria delle stringhe si trovi in ​​una posizione allocata separatamente. Non c'è motivo per cui non possa essere solo nella normale memoria heap. Il punto è che il compilatore tiene traccia di tutte quelle stringhe e garantisce che lo stesso riferimento sia usato per tutti i letterali, non è necessario che siano in un pool di memoria separato per farlo. – Servy

5

Non credo ci sia nulla di simile in .Net.

Invece ho letto this e interessa come vengono utilizzati Strings:

Il CLR mantiene una tabella chiamata pool interno che contiene le stringhe letterali in un programma. Ciò garantisce che l'uso ripetuto delle stringhe costanti nello stesso codice utilizzi la stessa stringa di riferimento . La classe System.String fornisce un metodo Intern che assicura che una stringa si trovi nel pool interno e restituisce il riferimento a .

controllare anche questo MSDN: -

Abbiamo visto numerosi scenari in cui l'heap gestito contiene i stessa stringa ripetuti migliaia di volte. Il risultato è un grande insieme funzionante impostato dove gran parte della memoria è consumata dalle stringhe. In questo situazione, spesso è meglio usare string interning.

1

framework .Net conserva stoccaggio stringa in una tabella, Intern Pool. Si può vedere:

String interning and String.Empty - Eric Lippert

Se si dispone di due identici stringhe letterali in un'unità di compilazione poi il codice che generiamo assicura che solo un oggetto stringa viene creato CLR per tutte le istanze di quella letterale all'interno dell'assemblea. Questa ottimizzazione è chiamata "internamento stringa".

String Interning .Net framework

Il Common Language Runtime conserva stoccaggio stringa mantenendo un tavolo, chiamato il pool interno, che contiene un solo riferimento alle ogni stringa letterale unica dichiarata o creata a livello di codice in il tuo programma Di conseguenza, un'istanza di una stringa letterale con un valore particolare esiste solo una volta nel sistema.