„Static Initialization Order Fiasko“ Enigma enthüllt
Das berüchtigte „Static Initialization Order Fiasko“ (SIOF) entsteht, wenn mehrere Dateien innerhalb eines C-Programms statische Variablen enthalten, die davon abhängen zur Initialisierung aufeinander. Betrachten Sie das folgende Beispiel:
// file1.cpp
extern int y;
int x = y + 1;
// file2.cpp
extern int x;
int y = x + 1;
Fragen:
-
Während der Kompilierung von file1.cpp führt der Compiler Folgendes aus:
- Speicher für dich zuweisen?
- Initialisieren x?
-
Führt der Compiler während der Kompilierung von file2.cpp Folgendes aus:
- Ordnet Speicher für x zu?
- Initialisiert y ?
-
Beim Verknüpfen von file1.o und file2.o, wenn file2.o zuerst initialisiert wird, erhält dann:
- x einen Anfangswert von 0?
- x bleibt nicht initialisiert?
Antworten:
Laut der C-Standard (3.6.2 „Initialisierung nicht-lokaler Objekte“):
-
a. Der Compiler weist keinen Speicher für y zu.
b. Der Compiler weist Speicher für x zu, tut dies aber nicht initialisieren Sie es.
-
a. Der Compiler weist keinen Speicher für x zu.
b. Der Compiler weist Speicher für y zu, aber wird nicht initialisiert it.
-
a. x erhält einen Anfangswert von 0.
b. x nicht bleiben nicht initialisiert.
Erklärung:
-
Schritt 1: x und y werden vor jeder anderen Initialisierung auf Null initialisiert.
-
Schritt 2: Entweder x oder y wird dynamisch initialisiert (Standard legt nicht fest, welche). Die initialisierte Variable erhält den Wert 1, da die andere Variable mit Null initialisiert wird.
-
Schritt 3: Die andere Variable wird dann dynamisch initialisiert und erhält den Wert 2.
Das obige ist der detaillierte Inhalt vonWas passiert während des Fiasko der statischen Initialisierungsreihenfolge in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn