2009-05-22 10 views
6

C#: che utilizza più memoria in testa? Una stringa o un carattere che contiene una sequenza di una parola?C#: che utilizza più overhead di memoria? Una stringa o un carattere che contiene una sequenza di una parola?

So che un char è fondamentalmente un array di ogni char per creare una parola (se più di un char), ma che alla fine ti causerà più memoria in testa come quando usi una stringa contro un char per contenere qualcosa lunghezza di una parola?

+3

Questa sembra una domanda a casa, ma nel caso non lo sia ... Se si deve scegliere tra stringa o char [] per risparmiare memoria, probabilmente non si dovrebbe programmare in C#. Dico questo perché la quantità di memoria utilizzata è più o meno un lavaggio perché un personaggio memorizzato in una stringa ha le stesse dimensioni di un archivio di caratteri in un carattere. – Tony

+1

Perché è importante? A meno che tu non abbia un milione di parole, non importa ... –

risposta

7

Dipende da quante volte è stata utilizzata la cosa in questione. Il modo .Net fa le stringhe è che se tu avessi più stringhe con lo stesso valore, quel valore è solo memorizzato in memoria una volta e ogni variabile stringa punta a quel valore. Tuttavia, ogni array di caratteri utilizzato avrebbe una propria allocazione di memoria anche se il contenuto del char array fosse identico.

es

//.Net Framework allocates memory space for "word" only once, all the three variables refer to this chunk of memory 
String s1, s2, s3; 
s1 = "word"; 
s2 = "word"; 
s3 = "word"; 

//.Net Framework allocates memory for each array 
char[] c1 = new char[] { 'w','o','r','d'}; 
char[] c2 = new char[] { 'w','o','r','d'}; 
char[] c3 = new char[] { 'w','o','r','d'}; 
+0

Hmmm. E cosa succede se cambio s1 = "word2"? Assegnerà spazio di memoria diverso per questo? E s2 e s3 condivideranno ancora lo stesso spazio, giusto? – Kirtan

+12

Il commento sulle "stesse stringhe" (ovvero "interning") si applica solo alle stringhe del codice sorgente (a meno che non lo richieda volontariamente). Quindi utilizzerà solo un'istanza di stringa per "word" ** dal codice sorgente ** e una per "word2" ** dal codice sorgente **. Ma: se costruisci la stringa "word2" * non dal sorgente * (concatenazione, o da input dell'utente, ecc.), Allora avrà un'istanza * diversa * - anche se lo fai 200 volte (con 200 istanze). –

0

Generalmente la stringa sta per essere più efficiente RobV sottolineato più stringhe con lo stesso valore di tutti riferimento la stessa stringa nella memoria questo è chiamato string interning. Questo può avere un grande bonus quando si confrontano le stringhe.

Se la memoria è un problema importante, probabilmente si vuole fare attenzione a come si gestiscono le stringhe, la concatenazione può diventare molto costosa.

+0

Solo le stringhe letterali sono internate per impostazione predefinita. –

2

Se si confronta la memoria di uno string e uno char[], sono abbastanza simili. Sono entrambi allocati nell'heap (eccetto stringhe letterali che vengono create in fase di compilazione). Entrambi contengono alcune variabili (per la lunghezza e così via) e un'area di memoria contenente un array di caratteri.

Tuttavia, a seconda di come è stato creato il string, l'area di memoria potrebbe essere più grande della lunghezza richiesta, ovvero ha alcuni byte inutilizzati alla fine dell'area di memoria. L'area di memoria di un char[] è sempre esattamente grande quanto richiesto dai dati.

Se ad esempio si utilizza StringBuilder per creare una stringa e la capacità è maggiore della sua lunghezza (ma non più di due volte), restituisce un oggetto string che contiene byte non utilizzati alla fine.

Esempio:

// set capacity to 8 
StringBuilder s = new StringBuilder(8); 
// put four characters in it 
s.Append("Ouch"); 
// get the string 
string result = s.ToString(); 

La variabile result ora punta a un oggetto stringa che ha un'area di memoria per i dati di caratteri che è di 16 byte, ma solo il primo 10 vengono utilizzati (quattro caratteri, più un carattere \x0 alla fine).

Problemi correlati