Come sono memorizzati
Sia il string
e la char[]
vengono memorizzati sul mucchio - in modo di memorizzazione è la stessa. Internamente suppongo che un string
sia semplicemente una cover per char[]
con lotti di codice aggiuntivo per renderlo utile per voi.
Anche se si hanno molte stringhe ripetute, è possibile utilizzare Interning per ridurre l'ingombro di memoria di tali stringhe.
La migliore opzione
mi favorirebbe stringa - è immediatamente più evidente ciò che il tipo di dati è e come si intende utilizzarlo. Le persone sono anche più abituate ad usare le stringhe, quindi la manutenibilità non ne risentirà. Beneficerai enormemente anche di tutto il codice che è stato fatto per te. Microsoft ha anche fatto un grande sforzo per assicurarsi che il tipo string
non sia un maiale performante.
L'allocazione Dimensioni
Non ho idea di quanto è allocato, credo che le stringhe sono abbastanza efficienti, nel senso che solo allocare sufficiente per memorizzare i caratteri Unicode - in quanto sono immutabili è sicuro di fare questo . Anche gli array non possono essere ridimensionati senza allocare lo spazio in una nuova matrice, quindi presumo nuovamente che afferrino solo ciò di cui hanno bisogno.
Overhead of a .NET array?
Alternative
Sulla base delle informazioni che ci sono solo 20 codici di lingua e le prestazioni è la chiave, si potrebbe dichiarare la propria enum al fine di ridurre la dimensione necessaria per rappresentare i codici:
enum LanguageCode : byte
{
en = 0,
}
Questo avverrà solo 1 byte anziché 4+ per due char
(in un array), ma limita la gamma di disponi e LanguageCode
valori nell'intervallo di byte
- che è più che sufficiente per 20 articoli.
È possibile visualizzare la dimensione dei tipi di valore utilizzando l'operatore sizeof()
: sizeof(LanguageCode)
. Le enumerazioni non sono altro che il tipo sottostante sotto il cappuccio, sono predefinite per int
, ma come puoi vedere nel mio esempio di codice puoi cambiarlo "ereditando" un nuovo tipo.
fonte
2012-05-28 09:58:50
Avete effettivamente dimostrato a te stesso che questo è ancora un problema? Ho raramente trovato il bisogno di preoccuparmi della memoria quando uso le stringhe, specialmente quelle piccole. Se non si presenta come un problema, non preoccuparti finché non lo è. È una soluzione facile in un secondo momento se le stringhe ti causano un problema di memoria. Altrimenti usa una stringa e non pensare nemmeno ai problemi di memoria. –
Ho una logica molto intensa che memorizza migliaia di questi in memoria, quindi ogni piccolo aiuto. –
@William Se le prestazioni sono così importanti, perché non dichiarare un 'enum LanguageCode: short' e salvare 2 byte? –