C++ xotira klasslari (Storage Classes)
C++ da har bir variable ikkita xususiyatga ega: turi va saqlash klassi.
Type o'zgaruvchida saqlanishi mumkin bo'lgan ma'lumotlar turini belgilaydi. Masalan: int , float , char va boshqalar.
Va saqlash klassi o'zgaruvchining ikki xil xususiyatini nazorat qiladi: umr (o'zgaruvchi qancha vaqt mavjud bo'lishi mumkinligini aniqlaydi) va qamrov (dasturning qaysi qismi unga kirish mumkinligini aniqlaydi).
O'zgaruvchining saqlash sinfiga qarab, uni 4 asosiy turga bo'lish mumkin:
Local variableGlobal variableStatic local variableRegister VariableThread Local StorageFunksiya ichida aniqlangan o'zgaruvchiga (qavslar orasidagi function tanasi ichida belgilangan) mahalliy o'zgaruvchi yoki avtomatik o'zgaruvchi deyiladi.
Uning doirasi faqat belgilangan funksiya bilan chegaralanadi. Oddiy so'zlar bilan aytganda, mahalliy o'zgaruvchi mavjud va unga faqat funksiya ichida kirish mumkin.
Funksiya tugaganda mahalliy o'zgaruvchining ishlash muddati tugaydi (u yo'q qilinadi).
#include <iostream>
using namespace std;
void test();
int main()
{
// mahalliy o'zgaruvchidan main() ga
int var = 5;
test();
// noqonuniy: var1 main() ichida e'lon qilinmagan
var1 = 9;
}
void test()
{
// test uchun mahalliy o'zgaruvchi()
int var1;
var1 = 6;
// noqonuniy: var test() ichida e'lon qilinmagan
cout << var;
}
test() ichida var o‘zgaruvchisidan va main() funksiyasi ichida var1dan foydalanib bo‘lmaydi.
Keyword auto was also used for defining local variables before as: auto int var;
Biroq, C++11 dan keyin auto boshqa ma'noga ega va mahalliy o'zgaruvchilarni aniqlash uchun ishlatilmasligi kerak.
Agar o'zgaruvchi barcha funksiyalardan tashqarida aniqlangan bo'lsa, u global o'zgaruvchi deb ataladi.
Global o'zgaruvchining qamrovi butun dasturdir. Bu shuni anglatadiki, u e'lon qilinganidan keyin dasturning istalgan qismida ishlatilishi va o'zgartirilishi mumkin.
Xuddi shunday, uning hayoti faqat dastur tugashi bilan tugaydi.
#include <iostream>
using namespace std;
// Global o'zgaruvchilar deklaratsiyasi
int c = 12;
void test();
int main()
{
++c;
// Chiqish 13
cout << c <<endl;
test();
return 0;
}
void test()
{
++c;
// Chiqishlar 14
cout << c;
}
Chiqish
13
14
Yuqoridagi dasturda c global o'zgaruvchidir.
Bu oʻzgaruvchi yuqoridagi dasturda main() va test() funksiyalariga koʻrinadi.
static kalit so'zi statik o'zgaruvchini belgilash uchun ishlatiladi. Masalan:
... .. ...
int main()
{
static float a;
... .. ...
}
Statik mahalliy o'zgaruvchi faqat e'lon qilingan funksiya ichida mavjud (mahalliy o'zgaruvchiga o'xshash), lekin uning ishlash muddati funksiya chaqirilganda boshlanadi va faqat dastur tugashi bilan tugaydi.
Mahalliy o'zgaruvchi va statik o'zgaruvchi o'rtasidagi asosiy farq shundaki, statik o'zgaruvchining qiymati dastur oxirida saqlanib qoladi.
#include <iostream>
using namespace std;
void test()
{
// var statik o'zgaruvchidir
static int var = 0;
++var;
cout << var << endl;
}
int main()
{
test();
test();
return 0;
}
Chiqish
1
2
Yuqoridagi dasturda test() funksiyasi 2 marta chaqiriladi.
Birinchi qo'ng'iroq paytida var o'zgaruvchisi statik o'zgaruvchi sifatida e'lon qilinadi va 0 ga ishga tushiriladi. Keyin ekranda ko'rsatilgan varga 1 qo'shiladi.
test() funksiyasi qaytsa, var o'zgaruvchisi hali ham mavjud, chunki u statik o'zgaruvchidir.
Ikkinchi funksiyani chaqirishda yangi var o'zgaruvchisi yaratilmaydi. Xuddi shu var 1 ga oshiriladi va keyin ekranga ko'rsatiladi.
Agar var statik o'zgaruvchi sifatida belgilanmagan bo'lsa, yuqoridagi dasturning chiqishi
1
1
register kalit so'zi registr o'zgaruvchilarini belgilash uchun ishlatiladi.
Registr o'zgaruvchilari avtomatik o'zgaruvchilarga o'xshaydi va faqat ma'lum bir funksiya ichida mavjud. Bu mahalliy o'zgaruvchilardan tezroq bo'lishi kerak.
Agar dastur registr o'zgaruvchisiga duch kelsa, u mavjud bo'lsa, o'zgaruvchini xotirada emas, balki protsessor registrida saqlaydi. Bu uni mahalliy o'zgaruvchilardan tezroq qiladi.
Biroq, bu kalit so'z C++ 11 da eskirgan va ishlatilmasligi kerak.
Mavzu-mahalliy saqlash - bu o'zgaruvchilarni shunday taqsimlash mexanizmi bo'lib, har bir mavjud ipda o'zgaruvchining bir nusxasi mavjud.
Buning uchun thread_local kalit so'zi ishlatiladi.
thread local storage haqida ko'proq bilib oling.