Ich bin ziemlich sicher, dass global deklarierte Variablen beim Programmstart zugewiesen (und gegebenenfalls initialisiert) werden.
int globalgarbage;
unsigned int anumber = 42;
Aber was ist mit statischen, die innerhalb einer Funktion definiert sind?
void doSomething()
{
static bool globalish = true;
// ...
}
Wann ist der Platz globalish
zugeteilt? Ich vermute, wann das Programm startet. Aber wird es dann auch initialisiert? Oder wird es initialisiert, wenn doSomething()
es zum ersten Mal aufgerufen wird?
Einige relevante Wörter aus C ++ Standard:
quelle
If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration.
Der Speicher für alle statischen Variablen wird beim Laden des Programms zugewiesen. Lokale statische Variablen werden jedoch bei der ersten Verwendung erstellt und initialisiert, nicht beim Programmstart. Es gibt einige gute Lektüre über das, und Statik in der Regel hier . Im Allgemeinen denke ich, dass einige dieser Probleme von der Implementierung abhängen, insbesondere wenn Sie wissen möchten, wo sich dieses Material im Speicher befindet.
quelle
Der Compiler weist statische Variablen zu, die in einer Funktion
foo
beim Laden des Programms definiert sind. Der Compiler fügt Ihrer Funktion jedoch auch einige zusätzliche Anweisungen (Maschinencode) hinzu,foo
sodass dieser zusätzliche Code beim ersten Aufruf die statische Variable initialisiert ( zB Aufrufen des Konstruktors, falls zutreffend).@Adam: Diese Code-Injektion hinter den Kulissen durch den Compiler ist der Grund für das Ergebnis, das Sie gesehen haben.
quelle
Ich versuche erneut, Code von Adam Pierce zu testen, und füge zwei weitere Fälle hinzu: statische Variable in Klasse und POD-Typ. Mein Compiler ist g ++ 4.8.1 unter Windows (MinGW-32). Das Ergebnis ist eine statische Variable in der Klasse, die mit einer globalen Variablen gleich behandelt wird. Sein Konstruktor wird vor der Eingabe der Hauptfunktion aufgerufen.
Schlussfolgerung (für g ++, Windows-Umgebung):
(1) : Der korrekte Zustand sollte lauten: "Bevor eine Funktion derselben Übersetzungseinheit aufgerufen wird". Für einfache, wie im folgenden Beispiel, ist es jedoch die Hauptfunktion.
include <iostream>
Ergebnis:
Hat jemand in Linux env getestet?
quelle
Statische Variablen werden innerhalb eines Codesegments zugewiesen - sie sind Teil des ausführbaren Images und werden daher bereits initialisiert zugeordnet.
Statische Variablen innerhalb des Funktionsumfangs werden gleich behandelt, das Scoping ist lediglich ein Konstrukt auf Sprachebene.
Aus diesem Grund wird Ihnen garantiert, dass eine statische Variable auf 0 initialisiert wird (sofern Sie nichts anderes angeben) und nicht auf einen undefinierten Wert.
Die Initialisierung bietet noch einige andere Aspekte, die Sie nutzen können. Beispielsweise ermöglichen gemeinsam genutzte Segmente, dass verschiedene Instanzen Ihrer ausführbaren Datei gleichzeitig auf dieselben statischen Variablen zugreifen.
In C ++ (mit globalem Gültigkeitsbereich) werden statische Objekte als Teil des Programmstarts unter der Kontrolle der C-Laufzeitbibliothek aufgerufen. Unter Visual C ++ kann mindestens die Reihenfolge, in der Objekte initialisiert werden, durch das Pragma init_seg gesteuert werden .
quelle
Ja, so ist es. Auf diese Weise können Sie unter anderem Datenstrukturen mit globalem Zugriff initialisieren, wenn dies angemessen ist, z. B. innerhalb von Try / Catch-Blöcken. ZB statt
Du kannst schreiben
und verwenden Sie es im try / catch-Block. Beim ersten Aufruf wird die Variable initialisiert. Beim ersten und nächsten Aufruf wird dann sein Wert zurückgegeben (als Referenz).
quelle