static
Variabel fungsi seumur hidup dimulai pertama kali [0] aliran program menemui deklarasi dan berakhir pada penghentian program. Ini berarti bahwa run-time harus melakukan pembukuan untuk menghancurkannya hanya jika itu benar-benar dibangun.
Selain itu, karena standar mengatakan bahwa penghancur objek statis harus berjalan dalam urutan terbalik dari penyelesaian konstruksi mereka [1] , dan urutan konstruksi dapat bergantung pada program spesifik yang dijalankan, urutan konstruksi harus diperhitungkan .
Contoh
struct emitter {
string str;
emitter(const string& s) : str(s) { cout << "Created " << str << endl; }
~emitter() { cout << "Destroyed " << str << endl; }
};
void foo(bool skip_first)
{
if (!skip_first)
static emitter a("in if");
static emitter b("in foo");
}
int main(int argc, char*[])
{
foo(argc != 2);
if (argc == 3)
foo(false);
}
Keluaran:
C:> sample.exe
Dibuat di foo
Hancur di foo
C:> sample.exe 1
Dibuat jika
Dibuat di foo
Hancur di foo
Hancur di jika
C:> sample.exe 1 2
Dibuat di foo
Diciptakan jika
Dihancurkan jika
Dihancurkan di foo
[0]
Karena C ++ 98 [2] tidak memiliki referensi ke banyak utas bagaimana ini akan berperilaku dalam lingkungan multi-utas tidak ditentukan, dan dapat menjadi masalah seperti yang disebutkan Roddy .
[1]
C ++ 98 bagian 3.6.3.1
[basic.start.term]
[2]
Dalam statika C ++ 11 diinisialisasi dengan cara yang aman, ini juga dikenal sebagai Statika Sihir .
[basic.start.term]
Motti benar tentang pesanan, tetapi ada beberapa hal yang perlu dipertimbangkan:
Compiler biasanya menggunakan variabel flag tersembunyi untuk menunjukkan apakah statika lokal telah diinisialisasi, dan flag ini diperiksa pada setiap entri ke fungsi. Jelas ini adalah hit kinerja kecil, tetapi yang lebih memprihatinkan adalah bahwa flag ini tidak dijamin aman.
Jika Anda memiliki statis lokal seperti di atas, dan
foo
dipanggil dari banyak utas, Anda mungkin memiliki kondisi balapan yang menyebabkanplonk
inisialisasi salah atau bahkan beberapa kali. Juga, dalam hal iniplonk
dapat dihancurkan oleh utas berbeda dari yang membangunnya.Terlepas dari apa yang dikatakan standar, saya akan sangat waspada terhadap urutan sebenarnya dari penghancuran statis lokal, karena mungkin Anda tanpa disadari bergantung pada statis yang masih berlaku setelah dihancurkan, dan ini benar-benar sulit untuk dilacak.
sumber
Penjelasan yang ada tidak benar-benar lengkap tanpa aturan aktual dari Standar, ditemukan pada 6.7:
sumber
FWIW, Codegear C ++ Builder tidak merusak dalam urutan yang diharapkan sesuai dengan standar.
... yang merupakan alasan lain untuk tidak bergantung pada perintah penghancuran!
sumber
The Variabel statis yang ikut bermain setelah dimulai pelaksanaan program dan tetap tersedia sampai ujung eksekusi program.
Variabel statis dibuat di Segmen Data Memori .
sumber