Wird ein String-Literal in C++ im statischen Speicher erstellt und nur gelöscht, wenn das Programm beendet wird?Wird ein String-Literal in C++ im statischen Speicher erstellt?
Antwort
Wo es erstellt wird, ist eine Implementierung Entscheidung vom Compiler-Schreiber, wirklich. Höchstwahrscheinlich werden String-Literale in schreibgeschützten Speichersegmenten gespeichert, da sie sich niemals ändern.
In den alten Compiler-Tagen hatten Sie statische Daten wie diese Literale und globale, aber änderbare Daten. Diese wurden im TEXT (Code) Segment und DATEN (initialisierte Daten) Segment gespeichert.
Auch wenn Sie Code wie char *x = "hello";
haben, die hello
Zeichenfolge selbst wird in Nur-Lese-Speicher gespeichert, während die Variable x
auf dem Stapel (oder an anderer Stelle im beschreibbaren Speicher, wenn es sich um eine globale ist). x
wird nur auf die Adresse der hello
Zeichenfolge festgelegt. Auf diese Weise können alle Arten von heikle Dinge wie String-Faltung, so dass „ungültige Option“ (0x1000) und „gültige Option“ (0x1002) Block den gleichen Speicher verwenden können, wie folgt:
+-> plus:0 1 2 3 4 5 6 7 8 9 A B C D E
| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
0x1000 | i | n | v | a | l | i | d | | o | p | t | i | o | n | \0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
Beachten Sie, I don‘ t bedeutet "Nur-Lese-Speicher" in Bezug auf ROM, nur Speicher, der zum Speichern von unveränderbarem Zeug (das vom OS wirklich schreibgeschützt markiert sein kann) bestimmt ist.
Sie werden auch nie zerstört, bis main()
beendet wird.
Ja, Zeichenfolgenliterale sind für die gesamte Dauer des Programms gültig, auch während der Zerstörung von statischen Objekten.
2.13.4/1 in der Norm sagt
Ein gewöhnlicher Stringliteral hat Typen "Array von n const char" und statischer Speicherdauer.
Die Norm sagt der ‚statischen Lagerdauer‘ in 3.7.1/1:
Der Speicher für diese Objekte für die Dauer des Programms dauern soll.
Nun ... Ja. Sie müssen irgendwie sein; Die Informationen, die die Zeichenfolge in jeder Zeichenfolge bilden, müssen irgendwo sein. Wenn sie dynamisch zugewiesen und dann initialisiert werden, wo würden die für die Initialisierung verwendeten Informationen liegen? Daher ist es effizienter, die Strings einfach statisch zu machen, so dass sie immer verfügbar und gültig sind, sobald das Programm geladen ist.
Zeichenfolgenliterale werden in schreibgeschützten Speichersegmenten gespeichert
Wahrscheinlich, aber nicht erforderlich. Eine konforme Implementierung * könnte String-Literale im Lese-Schreib-Speicher speichern. Jedes Programm, das den Unterschied erkennen kann, hat sowieso undefiniertes Verhalten. Natürlich ist es ratsam, sie im Nur-Lese-Speicher zu speichern (wenn das zugrunde liegende System dies unterstützt). –
Das BSS-Segment enthielt nur nullte, aber nicht konstante Daten; Daten, die auf Werte ungleich null initialisiert wurden, befanden sich im DATA-Segment. –
@Destructor, ich nehme an, dass das als Kommentar auf die Antwort von JamesHopkin gemeint war. * Das ist * die Antwort, die behauptet, dass "String-Literale für die gesamte Dauer des Programms gültig sind, sogar während der Zerstörung von statischen Objekten". Weder meine Antwort noch die der Entspannung (die andere, die Sie diesen Kommentar setzen) streitet dies, aber zumindest haben Sie James umgeben :-) – paxdiablo