Static Initialization Order Fiasco
"static initialization order fiasco" (SIOF) merujuk kepada kemungkinan isu yang boleh berlaku apabila menggunakan data statik ahli dalam program C. Keadaan ini timbul apabila berbilang fail sumber mentakrifkan ahli data statik dengan kebergantungan bulat.
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:
Berdasarkan pada coretan kod yang diberikan, bolehkah anda menerangkan langkah berikut yang mungkin berlaku semasa penyusunan dan memaut?
- Dalam file1.cpp, adakah pengkompil memperuntukkan storan dan memulakan y?
- Dalam file1.cpp, adakah pengkompil memperuntukkan storan untuk x?
- Dalam file2.cpp, adakah pengkompil memperuntukkan storan dan memulakan x?
- Dalam file2.cpp, adakah pengkompil memperuntukkan storan untuk y?
- Semasa memaut, jika file2.o dimulakan dahulu, adakah x akan dimulakan dengan nilai 0?
Jawapan:
Mengikut standard C (3.6.2 "Initialization of objek bukan tempatan"), langkah berikut berlaku:
-
Langkah 1: Sifar-Inisialisasi: Kedua-dua x dan y adalah sifar-dimulakan sebelum sebarang permulaan lain.
-
Langkah 2: Permulaan Dinamik: Piawaian tidak menyatakan pembolehubah (x atau y) yang mana dimulakan terlebih dahulu. Salah satu daripadanya akan dimulakan dengan nilai 1, kerana ia mengakses nilai permulaan sifar bagi pembolehubah lain.
-
Langkah 3: Permulaan Dinamik Pembolehubah Kedua: Pembolehubah yang tinggal akan dimulakan secara dinamik, memperoleh nilai 2.
- Oleh itu, jawapan kepada soalan kelima ialah tidak, x tidak dimulakan dengan nilai 0.
Atas ialah kandungan terperinci Apa yang Berlaku Semasa Penyusunan dan Pemautan dalam Fiasco Perintah Permulaan Statik C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!