Static Storage Duration — dastur bajarilishining butun davomida storage’i mavjud bo‘ladigan obyektlar lifetime toifasi. Namespace/global obyektlar va static deb e’lon qilingan local obyektlar shunga kiradi.
Initialization
Storage program boshlanishidan oldin yoki lazy initialization mexanizmi bilan tayyorlanadi, tugashda esa belgilangan tartibda destructor ishlashi mumkin. Zero-initialization dynamic initializationdan oldin keladi.
Tartib muammosi
C++ global dynamic initialization translation unitlar orasida noaniq tartib muammosini yaratadi. Bir global constructor boshqasiga tayanib qolsa “static initialization order fiasco” yuz beradi. Function-local static lazy yechim beradi.
Local static
Function-local static initialization zamonaviy C++da thread-safe bo‘lishi kerak; guard variable aynan bir thread constructorni bajarishini ta’minlaydi. Constructor exception chiqarsa keyingi call qayta urinishi mumkin.
Linkage farqi
Internal yoki external linkage nomning unitlar orasidagi ko‘rinishini belgilaydi, storage duration esa lifetime’ni. Ikkalasini aralashtirmaslik kerak. Read-only static data maxsus sectionga joylanishi mumkin.
Global holat
Global mutable state test isolation, reentrancy va concurrencyni qiyinlashtiradi. Explicit dependency va immutable configuration afzal. Shutdown destructor tartibiga kritik resursni bog‘lash nozik.
Sinov
Test startup/shutdown order, multi-thread local-static race, plugin load/unload va constructor failure’ni qamraydi. Binary section hamda symbol linkage tekshiriladi.
Amaliy nazorat
Static Storage Duration bilan ishlaydigan tizim initialization phase va linkageni aniq lifecycle va version bilan yuritadi. Pointer, mapping, navbat yoki exception holati boshqa qatlamga uzatilganda ownership hamda permission shartlari yo‘qolmaydi. Debug rejimda manzil, obyekt identifikatori va state transition qayd etiladi; production log ASLR, maxfiy ma’lumot va raw pointerlarni ochib yubormaydigan shaklga keltiriladi. Eskirgan handle yoki metadata reuse qilinmasligi uchun generation, build-id yoxud reference hisobidan foydalaniladi.
Muhim xavf — translation-unit initialization order. Bunday vaziyatda tizim taxmin bilan davom etmaydi: access fault, aniq error, konservativ fallback yoki nazoratli cleanup qo‘llanadi. Signal/fault kelgan nuqta har doim asl buzilish joyi emas; allocation, mapping va oxirgi ownership amallari trace’i tashxisga yordam beradi. Parallel accessda lock, atomic ordering va lifetime birgalikda tekshiriladi. Timeout yoki null check memory safetyning o‘rnini bosa olmaydi.
Sifat nazorati startup, local-static va shutdown testi orqali bajariladi. Sinovlar normal holat bilan birga nol uzunlik, page boundary, alignment, juda katta offset, concurrent close/free, permission o‘zgarishi va platforma farqlarini qamraydi. Correctness avval etalon hamda invariant bilan tekshiriladi, keyin page fault, cache miss, contention, latency yoki xotira sarfi o‘lchanadi. Sanitizer, fault injection va malformed-input fuzzing topgan minimal holat doimiy regressiya testiga aylantiriladi.
Static storage durationli obyekt dastur ishga tushishidan yakunlanishigacha mavjud bo‘ladi, ammo uning nomining linkage’i alohida qoidadir. Namespace-scope static ichki linkage berishi mumkin; function-local static esa lokal ko‘rinish bilan uzoq lifetime’ni birlashtiradi. C++da constant initialization imkon qadar erta bajariladi, dynamic initialization esa tarjima birliklari o‘rtasida tartib muammosiga duch kelishi mumkin. Function-local staticning birinchi chaqiriqda thread-safe yaratilishi zamonaviy C++ kafolatidir. Destruction paytida boshqa static obyektga murojaat qilish ham tartibga bog‘liq xato tug‘dirishi mumkin.
Bog‘liq tushunchalar
global variable, static local, initialization order, linkage, object lifetime, thread safety