Wo werden die lokalen, globalen, statischen, auto-, register-, extern-, const- und volatile-Variablen gespeichert?
Wo werden die lokalen, globalen, statischen, auto-, register-, extern-, const- und volatile-Variablen gespeichert?
Matrix
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
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
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
, const
und 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
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“.
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
In der Erinnerung…?
– BoltClock
10. September 2010 um 12:59 Uhr