2015-10-04 12 views
11

In C hat der Compiler einen Zeiger auf den Anfang der Zeichenfolge und hat ein Endsymbol ('\0'). Wenn ein Benutzer die Länge des Strings berechnen möchte, muss der Compiler Elemente des String-Arrays zählen, bis er '\0' findet.Wie sehen Strings aus der Sicht des Compilers aus?

In hat der Compiler die Länge der Zeichenfolge in den ersten Symbolen.

Und was denkt der Compiler über C#-strings? Ja, aus Sicht des Anwenders String ist ein object mit einem Feld Length, ich spreche nicht über High-Level-Zeug. Ich möchte tiefe Algorithmen kennenlernen; Wie berechnet der Compiler beispielsweise die Länge der Zeichenfolge?

+4

Ihre C-Annahme ist falsch. Ein C-Compiler weiß ** genau, wie lang jeder String ist. Um dies zu sehen, rufen Sie 'sizeof' auf der Zeichenkette auf (nicht auf einem _pointer to_ der Zeichenkette!). – MSalters

+1

Normalerweise würde ich das als Dupe schließen, aber die Duplikate sind schlecht. http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED – usr

+0

@MSalter Sie sind Konzepte verwirrend. Arrays und Zeichenketten verschiedener Entitäten, denen verschiedene Operationen zugeordnet sind. Sie sind verwandt, aber sie sind unterschiedliche Abstraktionen und sollten nicht gemischt werden. –

Antwort

21

Lassen Sie sich den folgenden Code ausführen:

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

nun einen Haltepunkt in der letzten Zeile setzen lassen und das Speicherfenster öffnen:

Strings

s3 in der Schrift Speicherfenster können wir die 2 sehen (s3 und s4) str Diese werden am Anfang nacheinander mit 4 Bytes Größe belegt.

Sie können auch sehen, dass andere Speicher zugeordnet ist wie die strings Klassentyp Token und andere string Klasse Daten.

Die string class selbst enthält ein Element private int m_stringLength;, die die Länge der string enthält, das macht auch string.Concat() super schnell ausführen (durch die gesamte Länge am Anfang Zuteilung):

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); 

Was finde ich ein wenig seltsam ist, dass die Implementierung von IEnumerable<char>.Count() für string unter Verwendung der Standardimplementierung durchgeführt wird, was bedeutet, Elemente nacheinander zu iterieren, im Gegensatz zu s wie List<T>, wobei IEnumerable<char>.Count() implementiert wird, indem seine ICollection<T>.Count Eigenschaft genommen wird.

+2

@homk Wenn Sie das wissen wollten, hat Ihre eigentliche Frage nichts mit "aus der Sicht des Compilers" zu tun. – EJP