Wo werden die lokalen, globalen, statischen, auto-, register-, extern-, const- und volatile-Variablen gespeichert?

Lesezeit: 4 Minuten

Benutzeravatar von Matrix
Matrix

Wo werden die lokalen, globalen, statischen, auto-, register-, extern-, const- und volatile-Variablen gespeichert?

  • In der Erinnerung…?

    – BoltClock

    10. September 2010 um 12:59 Uhr

Benutzeravatar von Ferruccio
Ferruccio

  • lokal Variablen können entweder auf dem Stapel oder in einem Datensegment gespeichert werden, je nachdem, ob sie automatisch oder statisch sind. (wenn weder auto noch static explizit angegeben ist, wird auto angenommen)

  • global Variablen werden in einem Datensegment gespeichert (es sei denn, der Compiler kann sie wegoptimieren, siehe const) und sind vom Deklarationspunkt bis zum Ende der Kompiliereinheit sichtbar.

  • statisch Variablen werden in einem Datensegment gespeichert (wiederum, es sei denn, der Compiler kann sie wegoptimieren) und sind vom Deklarationspunkt bis zum Ende des einschließenden Gültigkeitsbereichs sichtbar. Globale Variablen, die nicht statisch sind, sind auch in anderen Übersetzungseinheiten sichtbar (siehe extern).

  • Auto Variablen sind immer lokal und werden auf dem Stack gespeichert.

  • Die registrieren modifier weist den Compiler an, sein Bestes zu geben, um die Variable möglichst in einem Register zu halten. Andernfalls wird es auf dem Stack gespeichert.

  • extern Variablen werden im Datensegment gespeichert. Der Modifizierer extern teilt dem Compiler mit, dass tatsächlich eine andere Kompilierungseinheit die Variable deklariert, erstellen Sie also keine weitere Instanz davon, da es sonst beim Linken zu einer Namenskollision kommt.

  • konst Variablen können entweder auf dem Stapel oder in einem schreibgeschützten Datensegment gespeichert werden, je nachdem, ob sie automatisch oder statisch sind. Wenn der Compiler jedoch feststellen kann, dass sie nicht von einer anderen Kompilierungseinheit referenziert werden können oder dass Ihr Code die Adresse der const-Variablen nicht verwendet, kann er sie frei optimieren (jede Referenz kann durch den konstanten Wert ersetzt werden). . In diesem Fall wird es nirgendwo gespeichert.

  • Die flüchtig modifier teilt dem Compiler mit, dass sich der Wert einer Variablen jederzeit durch externe Einflüsse (normalerweise Hardware) ändern kann, sodass er nicht versuchen sollte, Neuladungen aus dem Speicher in ein Register wegzuoptimieren, wenn auf diese Variable verwiesen wird. Dies impliziert eine statische Speicherung.

Übrigens gilt das alles für C & C++ sowie Objective-C.

  • Mit “Textsegment” meinen Sie “Datensegment”, außer wenn Sie über Konstanten sprechen.

    – JeremyP

    10. September 2010 um 13:58 Uhr

  • Groß! +1 für die brillante Antwort. Es wird perfekter, wenn Sie in diesem Zusammenhang den Heap-Speicher und den Zeiger erwähnen!

    – Arun Chettoor

    10. Januar 2015 um 11:48 Uhr

Benutzeravatar von hotpaw2
Hotpaw2

Auf welcher Abstraktionsebene suchen Sie nach einer Antwort?

Auf physikalischer Ebene sind sie wahrscheinlich alle in Gate-Kapazitäten und magnetischen Domänen gespeichert. (Vielleicht sogar Photonen, wenn Ihre Auslagerungsplatte mit Wi-Fi oder Glasfaser verbunden ist.)

Auf einer Hardwareebene könnten Kopien aller dieser Variablen an mehreren Stellen im Register, im Datencache (möglicherweise auf mehreren Ebenen), im Hauptspeicher und/oder in der Speicherhierarchie vorhanden sein, alles von vollständig ausgelagert auf Festplatte oder nichtflüchtiger Speicher Speicher (abhängig von der Existenz, Implementierung und dem aktuellen Zustand eines bedarfsgesteuerten virtuellen Speichersubsystems) bis hin zu vielleicht allem in Registern, wenn die Größe und Lebensdauer Ihrer Anwendung klein genug ist.

Bei den bekanntesten Compiler- und Laufzeitimplementierungen wird Speicher (möglicherweise virtuell) in sogenannte Stacks und Heaps aufgeteilt. Angesichts der formalen Sprachdefinition kann dieses Hacken erforderlich sein oder auch nicht.

Auf der Compiler-Optimierungsebene wurden viele dieser Variablen möglicherweise nicht mehr optimiert. Sie werden nirgendwo gespeichert, außer als Abstraktion.

  • +100 Ich wünschte, ich könnte so oft wie nötig abstimmen, um dies zur Antwort mit den meisten Stimmen zu machen 🙂

    – pmg

    10. September 2010 um 18:07 Uhr

  • Ich mag den abstrakten Teil am meisten.

    – Praveen S

    11. September 2010 um 6:54 Uhr

Benutzeravatar von Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Lokal und auto Variablen werden auf dem Stack gespeichert. Global und static Variablen werden auf einer DATA-Seite gespeichert. register Variablen werden möglichst in einem Register auf der CPU abgelegt, ansonsten im Stack. extern, constund volatile geben Sie nicht an, wo die Variable gespeichert wird; Die Variable wird dort gespeichert, wo die anderen Speicherbezeichner angeben, dass sie sich befinden.

  • Textsegmente werden normalerweise nur gelesen. Globale Variablen befinden sich in einem Datensegment.

    – JeremyP

    10. September 2010 um 13:59 Uhr

Benutzeravatar von mipadi
mipadi

Lokale Variablen werden normalerweise auf dem Stack gespeichert und globale Variablen im “Text”-Segment eines Programms (im Fall von String-Konstanten) oder auf dem Heap, wenn sie dynamisch zugewiesen werden. Auto-Variablen werden normalerweise in Funktionen/Methoden verwendet und im Allgemeinen auf dem Stapel übergeben (manchmal auch in Registern, je nach Architektur). Register-Variablen wurden früher in Registern gespeichert, aber heutzutage ignorieren die meisten Compiler das Register-Schlüsselwort und platzieren sie, wo immer sie es für richtig halten – auf dem Stack oder in einem Register. Extern-, const- und volatile-Mitglieder sind Modifikatoren und haben daher keinen endgültigen Ort, an dem sie gespeichert werden.

Die kurze Antwort lautet also wie üblich „es kommt darauf an“.

Benutzeravatar von kumar123
kumar123

Lokal

Lokale Variablen, deren Gültigkeitsbereich innerhalb der Funktion liegt. Es können zwei Arten sein, Auto oder statisch.

Wenn es einfach int var deklariert ist, behandelt der Compiler es als die Auto Speicherklasse. Die Auto-Variablen werden auf dem Stack gespeichert.

Die statischen Variablen werden in gespeichert Datensegment.

Die Registervariablen werden in der CPU gespeichert. Wenn keine Register zum Speichern von Variablen verfügbar sind, behandelt der Compiler sie als Auto-Variable.

Die globalen Variablen werden in der gespeichert Datensegment Bereich.

Die konstanten Variablen werden in der gespeichert schreibgeschützter Bereich. Das ist Codesegment Bereich der Erinnerung.

  • Betreff “Datensegment” und “Codesegment”: Ist das nicht auf einige beschränkt x86 Systeme?

    – Peter Mortensen

    22. November 2022 um 16:40 Uhr


  • Betreff “Datensegment” und “Codesegment”: Ist das nicht auf einige beschränkt x86 Systeme?

    – Peter Mortensen

    22. November 2022 um 16:40 Uhr


1438060cookie-checkWo werden die lokalen, globalen, statischen, auto-, register-, extern-, const- und volatile-Variablen gespeichert?

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

Privacy policy