Wird ein Zeichenfolgenliteral in С++ im statischen Speicher erstellt?

Lesezeit: 3 Minuten

Wird ein Zeichenfolgenliteral in С im statischen Speicher erstellt
jaraaj

Wird ein Zeichenfolgenliteral in C++ im statischen Speicher erstellt und nur zerstört, wenn das Programm beendet wird?

Wird ein Zeichenfolgenliteral in С im statischen Speicher erstellt
James Hopkins

Ja, String-Literale gelten für die gesamte Laufzeit des Programms, auch während der Zerstörung statischer Objekte.

2.13.4/1 im Standard sagt

Ein gewöhnliches String-Literal hat den Typ “Array of n const char” und eine statische Speicherdauer.

Die Norm sagt zur „statischen Speicherdauer“ in 3.7.1/1:

Die Aufbewahrung dieser Gegenstände erfolgt für die Dauer des Programms.

1646971214 606 Wird ein Zeichenfolgenliteral in С im statischen Speicher erstellt
paxdiablo

Wo es erstellt wird, ist eigentlich eine Implementierungsentscheidung des Compiler-Autors. Höchstwahrscheinlich werden Zeichenfolgenliterale in schreibgeschützten Speichersegmenten gespeichert, da sie sich nie ändern.

In den alten Compiler-Tagen gab es statische Daten wie diese Literale und globale, aber veränderbare Daten. Diese wurden im Segment TEXT (Code) und im Segment DATA (initialisierte Daten) gespeichert.

Auch wenn Sie Code wie haben char *x = "hello";der hello Die Zeichenfolge selbst wird im Nur-Lese-Speicher gespeichert, während die Variable x befindet sich auf dem Stapel (oder an anderer Stelle im beschreibbaren Speicher, wenn es sich um eine globale handelt). x wird nur auf die Adresse des eingestellt hello Schnur. Dies ermöglicht alle möglichen kniffligen Dinge wie das Falten von Zeichenfolgen, sodass “ungültige Option” (0x1000) und “gültige Option” (0x1002) denselben Speicherblock wie folgt verwenden können:

+-> 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 |
       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

Denken Sie daran, dass ich nicht schreibgeschützten Speicher in Bezug auf ROM meine, sondern nur Speicher, der zum Speichern unveränderlicher Dinge bestimmt ist (die vom Betriebssystem möglicherweise als wirklich schreibgeschützt gekennzeichnet sind).

Sie werden auch nie zerstört bis main() Ausgänge.

  • Das BSS-Segment enthielt immer nur genullte, aber nicht konstante Daten; Daten, die mit Werten ungleich Null initialisiert wurden, befanden sich im DATA-Segment.

    – Jonathan Leffler

    4. August 2011 um 22:21 Uhr

  • @Destructor, ich nehme an, das war als Kommentar zur Antwort von JamesHopkin gemeint. Das ist die Antwort, die behauptet, dass “String-Literale für die gesamte Dauer des Programms gültig sind, selbst während der Zerstörung statischer Objekte”. Weder meine Antwort noch die von Unwind (die andere, zu der Sie diesen Kommentar abgegeben haben) behaupten dies, aber zumindest haben Sie James umzingelt 🙂

    – paxdiablo

    21. Februar 2017 um 12:52 Uhr


Nun ja. Sie müssen irgendwie sein; Irgendwo müssen die Informationen stehen, aus denen sich die Zeichenfolge in jeder Zeichenkette zusammensetzt. Wenn sie dynamisch zugewiesen und dann initialisiert würden, wo würden sich die für die Initialisierung verwendeten Informationen befinden? Daher ist es effizienter, die Zeichenfolgen einfach statisch zu machen, sodass sie immer verfügbar und gültig sind, sobald das Programm geladen ist.

  • Wahrscheinlich, aber nicht erforderlich. Eine konforme Implementierung könnten String-Literale im Lese-Schreib-Speicher speichern. Jedes Programm, das den Unterschied erkennen kann, hat sowieso undefiniertes Verhalten. Natürlich ist es eine gute Idee, sie im Nur-Lese-Speicher zu speichern (wenn das zugrunde liegende System dies unterstützt).

    – Keith Thompson

    15. September 2011 um 4:42 Uhr

989800cookie-checkWird ein Zeichenfolgenliteral in С++ im statischen Speicher erstellt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy