2015-10-04 15 views
11

Nel C, il compilatore ha un puntatore all'inizio della stringa e ha un simbolo di fine ('\0'). Se un utente desidera calcolare la lunghezza della stringa, il compilatore deve contare gli elementi dell'array di stringhe finché non trova '\0'.Come appaiono le stringhe dal punto di vista del compilatore?

In UCSD-strings, il compilatore ha la lunghezza della stringa nei primi simboli.

E cosa pensa il compilatore di C#-strings? Sì, dal punto di vista dell'utente String è un object che ha un campo Length, non sto parlando di cose di alto livello. Voglio conoscere algoritmi profondi; ad esempio, in che modo il compilatore calcola la lunghezza della stringa?

+4

L'assunzione di C è errata. Un compilatore C sa ** esattamente ** per quanto tempo ogni stringa è. Per vedere ciò, chiama 'sizeof' sulla stringa (non su un _pointer to_ la stringa!). – MSalters

+1

Normalmente, vorrei chiudere questo come un dupe ma i duplicati sono cattivi. http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED – usr

+0

@MSalters Stai confondendo concetti. Array e stringhe di entità diverse e hanno diverse operazioni associate a loro. Sono correlati, ma sono astrazioni diverse e non dovrebbero essere mescolati. –

risposta

21

Diamo eseguire il seguente codice:

string s = "123"; 
string s2 = "234"; 
string s3 = s + s2; 
string s4 = s2 + s3; 
Console.WriteLine(s + s2); 

Ora mettiamo un punto di interruzione l'ultima riga e aprire la finestra di memoria:

Strings

Scrivendo s3 nel finestra di memoria possiamo vedere il 2 (s3 e s4) str ings assegnati uno dopo l'altro con 4 byte di dimensione all'inizio.

Inoltre, è possibile vedere che è allocata altra memoria, ad esempio il token di classe strings e altri dati di classe string.

Il string class sé contiene un membro private int m_stringLength; che contiene la lunghezza della string, questo rende anche string.Concat() eseguire super veloce (destinando l'intera lunghezza all'inizio):

int totalLength = str0.Length + str1.Length + str2.Length; 

String result = FastAllocateString(totalLength); 
FillStringChecked(result, 0, str0); 
FillStringChecked(result, str0.Length, str1); 
FillStringChecked(result, str0.Length + str1.Length, str2); 

quello che trovo un po 'strano è che l'implementazione di per string viene eseguita utilizzando l'implementazione predefinita che significa iterando gli articoli uno per uno a differenza di ICollection<T> s come List<T> in cui lo IEnumerable<char>.Count() viene implementato prendendo la sua proprietà ICollection<T>.Count.

+2

@homk Se è questo che volevi sapere, la tua vera domanda non ha nulla a che fare con "dal punto di vista del compilatore". – EJP

Problemi correlati