Enigma "Static Initialization Order Fiasco" Didedahkan
"static initialization order fiasco" (SIOF) yang terkenal timbul apabila berbilang fail dalam program C mengandungi pembolehubah statik yang bergantung antara satu sama lain untuk permulaan. Pertimbangkan contoh berikut:
// file1.cpp
extern int y;
int x = y + 1;
// file2.cpp
extern int x;
int y = x + 1;
Salin selepas log masuk
Soalan:
-
Semasa penyusunan fail1.cpp, adakah pengkompil:
- Peruntukkan storan untuk y?
- Mulakan x?
-
Semasa penyusunan fail2.cpp, adakah pengkompil:
- Peruntukkan storan untuk x?
- Memulakan y ?
-
Apabila memaut file1.o dan file2.o, jika file2.o dimulakan dahulu, adakah:
- x menerima nilai awal 0?
- x kekal tidak dimulakan?
Jawapan:
Mengikut standard C (3.6.2 "Inisialisasi objek bukan tempatan"):
-
a. Penyusun adakah tidak memperuntukkan storan untuk y.
b. Pengkompil memperuntukkan storan untuk x tetapi tidak memulakannya.
-
a. Pengkompil tidak tidak memperuntukkan storan untuk x.
b. Pengkompil memperuntukkan storan untuk y tetapi tidak memulakannya.
-
a. x menerima nilai awal daripada 0.
b. x tidak kekal tidak dimulakan.
Penjelasan:
-
Langkah 1: x dan y ialah dimulakan sifar sebelum sebarang permulaan lain.
-
Langkah 2: Sama ada x atau y dimulakan secara dinamik (standard tidak menentukan yang mana). Pembolehubah yang dimulakan menerima nilai 1, kerana pemboleh ubah lain adalah dimulakan sifar.
-
Langkah 3: Pembolehubah lain kemudiannya dimulakan secara dinamik, menerima nilai 2.
Atas ialah kandungan terperinci Apa yang Berlaku Semasa Fiasco Perintah Permulaan Statik dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!