Ich bin nur neugierig, wie sind Strings im Speicher gespeichert? Zum Beispiel, wenn ich das tue:
%Vor%es weist 4 Bytes zu, oder? %Code%.
Aber später, wenn ich dieser Zeichenfolge einen neuen Text zuweisen möchte, funktioniert es, aber ich verstehe nicht wie. Zum Beispiel mache ich das:
%Vor%Jetzt sollte es 10 Bytes lang sein. Was aber, wenn für eine solche Saite kein Platz wäre? Nehmen wir an, dass das fünfte + sechste Byte vom Anfang des Strings von anderen 2 Zeichen genommen wird. Wie geht die CPU damit um? Es findet eine völlig neue Position in der Erinnerung, wo diese Zeichenfolge passt?
Dies ist implementierungsabhängig, aber die allgemeine Idee ist, dass die String-Klasse einen Zeiger auf einen Bereich des Speichers enthält, in dem der tatsächliche Inhalt des Strings gespeichert ist. Zwei gebräuchliche Implementierungen sind das Speichern von 3 Zeigern (Beginn der zugewiesenen Region und Daten, Ende der Daten, Ende der zugewiesenen Region) oder eines Zeigers (Beginn der zugewiesenen Region und Daten) und zwei Ganzzahlen (Anzahl der Zeichen in der Folge und Anzahl der zugewiesenen Bytes).
Wenn neue Daten an die Zeichenkette angehängt werden, wird sie, wenn sie zur zugewiesenen Region passt, einfach geschrieben und die Größe / das Ende des Datenzeigers wird entsprechend aktualisiert. Wenn die Daten nicht in die Region passen, wird ein neuer Puffer erstellt und die Daten kopiert.
Beachten Sie auch, dass viele Implementierungen Optimierungen für kleine Strings enthalten, wobei die String-Klasse einen kleinen Puffer enthält. Wenn der Inhalt der Zeichenfolge in den Puffer passt, wird kein Speicher dynamisch zugewiesen und nur der lokale Puffer wird verwendet.
string
ist kein einfacher Datentyp wie char *
. Es ist eine Klasse mit Implementierungsdetails, die nicht unbedingt sichtbar sind.
Unter anderem enthält string
einen Zähler, um zu verfolgen, wie groß dieser wirklich ist.
Vorschlag: schreiben Sie ein einfaches Programm und durchlaufen Sie es mit einem Debugger. Untersuchen Sie die string
und sehen Sie, wie sich die privaten Mitglieder ändern, wenn der Wert geändert wird.
string
ist ein Objekt, nicht nur ein Speicherort. Es weist Speicher dynamisch nach Bedarf zu.
Der Operator =
ist überladen; Wenn Sie testString = "123456789";
sagen, wird eine Methode aufgerufen und behandelt die von Ihnen übergebene const char *
.
Es ist mit einer Größe gespeichert. Wenn Sie eine neue Zeichenfolge speichern, wird der vorhandene Speicher optional freigegeben und neuer Speicher zugewiesen, um die Größenänderung zu bewältigen.
Und es weist nicht unbedingt 4 Bytes zu, wenn Sie ihm zum ersten Mal eine Folge von 4 Bytes zuweisen. Es kann mehr Platz als das zuweisen (es wird nicht weniger zuweisen).