Domanda

Lo lavoro stringa immutabilità dalla dichiarazione, o con le stringhe all'interno di una dichiarazione?

Per esempio, ho capito che il seguente codice assegnerà due stringhe sul mucchio.

string s = "hello ";
s += "world!";

"ciao" rimarrà sul mucchio fino garbage collection; e S ora riferimenti "Ciao mondo!" sul mucchio. Tuttavia, il numero di stringhe fa la seguente riga allocare sul mucchio ... 1 o 2? Inoltre, c'è uno strumento / modo di verificare i risultati?

string s = "goodbye " + "cruel world!";
È stato utile?

Soluzione

Il compilatore ha un trattamento speciale per concatenazione di stringhe, che è il motivo per cui il secondo esempio è sempre e solo una della stringa. E "internato" significa che, anche se si esegue questa linea 20000 volte v'è ancora solo 1 stringa.

Re verificare i risultati ... il modo più semplice (in questo caso) è probabilmente guardare riflettore:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

Come si può vedere (ldstr), il compilatore ha fatto questo per voi già.

Altri suggerimenti

Le stringhe letterali sono internati ciò significa che "hello " non risiedere sul mucchio, ma nel segmento di dati [vedi commento] del progamma (e non è quindi idoneo per la raccolta dei rifiuti), lo stesso vale per "world", come per "hello world" che possono essere anche internati, se il compilatore è abbastanza intelligente.

"goodbye cruel world" essere internati in quanto concatenazione di stringhe letterale è qualcosa trattata dal compilatore.


Modifica non sono sicuro circa la dichiarazione segmento di dati, si veda questa domanda per ulteriori informazioni.

In realtà, probabilmente 3. una stringa const per "addio", una stringa const per "mondo crudele", e poi una nuova stringa per il risultato.

Si può scoprire di sicuro guardando il codice generato. Dipende dal compilatore, (e, in effetti, sulla lingua, questo non è ovvio), ma si può leggere l'output di g ++ utilizzando il flag -a (credo, controllare la pagina man) per ottenere il codice intermedio .

Non fidarti di quello che "conoscere" sulle stringhe. Si potrebbe guardare attraverso il codice sorgente per l'attuazione della stringa. Per esempio il tuo esempio:

string s = "goodbye " + "cruel world!";

In java sarebbe allocare una singola stringa. Java gioca alcuni trucchi abbastanza carino e sarebbe difficile da superare in astuzia - proprio mai ottimizzare fino a quando è necessario

Al momento però, per quanto ne so, utilizzando questo:

String s="";
for(int i=0;i<1000;i++)
    s+=" ";

per creare una stringa di 1000 spazio ancora tende ad essere estremamente inefficiente

L'aggiunta in un ciclo è piuttosto male, ma per il resto è probabilmente il più efficiente StringBuilder.

Fare attenzione qui, perché il compilatore può fare alcune ottimizzazioni molto diverse quando i valori di stringa sono noti al momento della compilazione. Se le stringhe che si sta utilizzando non sono noti fino al runtime (tirato da un file di configurazione, database o l'input dell'utente) vedrete alcuni molto diversa IL.

Se hai intenzione di fare uno o due concatenazioni di stringhe non mi preoccuperei su di esso.

Tuttavia, se si dispone di molti concatenazioni, o avete un ciclo, allora sicuramente vuole prendere precauzioni. Nel mondo Java che significa utilizzare StringBuffer insteads di concatenare stringa.

Se non è solo in una linea, la concatenazione di due stringhe può essere realizzato facendo la prima stringa in uno StringBuffer, facendo la concatenazione, e restituendo la stringa risultato.

Creazione del StringBuffer te può sembrare eccessivo, ma è quello che sta per accadere in ogni caso .-

Con tutti i mezzi non prematuramente ottimizzare, ma non scontano quanto male performanti concatonations stringa può essere. Non è la creazione di oggetti, ma il lavoro GC che essa provoca.

C'è un laboratorio su (ASP.NET Escalation Engineer) blog di Tess Ferrnandez che mostrano un (piuttosto estremo, concesso) esempio di come stringa concatonation può portare un server in ginocchio .

Se il compilatore è "intelligente", sarà solo una stringa con "addio mondo crudele!"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top