Ko‘rsatkichlar



Yüklə 117,5 Kb.
səhifə2/7
tarix16.06.2023
ölçüsü117,5 Kb.
#131322
1   2   3   4   5   6   7
KO

Tezkor xotira(RAM)


Tezkor xotira o’zida vaqtinchalik qiymatlarni saqlash uchun ishlatiladi. U xuddi kataklarga bo’lib chiqilganga o’xshaydi, har bir katak 1 baytdan ma’lumotni sig’dira oladi va o’zining unikal(yagona) manziliga ega bo’ladi. Undagi qiymatga murojaat qilishimiz uchun biz o’sha qiymatning xotiradagi manzilini bilishimiz shart. Lekin inson raqamlardan ko’ra so’zlarni osonroq eslab qoladi. Shundan kelib chiqib, dasturlashda qiymatlarning xotiradagi manziliga nom biriktirish fikri tug’ilgan.
int birthday = 1;
yuqoridagi holda birthday kompilyatsiyadan so’ng qandaydir manzilga almashtiriladi. Ba’zi insonlarda “o’zgaruvchiga nomni qisqa bersam, dasturim tezroq ishlaydi” degan xato fikr o’rnashib qolgan bo’ladi, lekin o’zgaruvchi nomini 1 ta harf yoki kompilyator tomonidan belgilangan maksimal uzunlikda nomlash ahamiyatga ega emas.

Lokal o’zgaruvchilar


C++ da figurali qavslar({}) orasida e’lon qilingan o’zgaruvchilar faqat o’sha yerda “yashashini” bilsangiz kerak(Albatta, bunda ba’zi istisnolar mavjud, masalan static kalit so’zi bilan e’lon qilinadigan o’zgaruvchilar). Buni aniqlash uchun bizga kuchli debugging dasturlar shartmas, shunchaki kichik kod yozamiz:
class Test{
public:
Test(){}
~Test(){cout<<”Obyekt o’chirildi!\n”;}
};
int main(){
Test t;
return 0;
}

Kodni yurgazib ko’rgach, obyekt o’chirilgani haqidagi ma’lumotni ko’rasiz(kodni tushunmasangiz, C++ da obyektga yo’naltirilgan dasturlash, destruktorlar haqida o’qib ko’rib, maqolani kelgan joyidan davom ettirishingiz mumkin). Biz shu va shundan keyingi namunalarda konstruktor/desktruktordan obyekt xotiraga joylashgani/o’chirilgani haqida signal sifatida ishlatamiz. Bunda biz e’lon qilgan o’zgaruvchimiz RAMga qanday yozilyapti?

Stack



Stack(o’qilishi Stek) — ma’lumotlarni tezkor xotiraga(keyinchalik qisqalik uchun RAM deb ketaman) joylash usuli deyishim mumkin. U LIFO(last in — first out) shaklida ishlaydi, gap siz ma’lumotlar tuzilmalari(data structures)da ko’rgan stack haqida emas, lekin ularning ishlash prinsiplari bir-xil. Stackning ba’zi xususiyatlari:

  • Dastur ishga tushgach, u uchun alohida stack beriladi

  • Stack o’lcham jihatdan chegaralangan bo’ladi

  • Qiymatlar kiritilishida ancha tez

  • Lokal o’zgaruvchilar, qaytish qiymatlar va funksiyaga parametrlarni uzatishda foydalaniladi

  • Xotiradan joy olish chiziqli tartibda amalga oshiriladi

  • Hajm jihatdan stack chegaaralangan, shuning uchun sizga qancha joy kerakligini va u stackning maksimal hajmidan kichikligini bilgan holda undan foydalanishingiz mumkin

  • Dastur ishini tugatgach, stack avtomatik ravishda tozalab tashlanadi.

Ha, yuqoridagi t o’zgaruvchimiz ham stackka kiritilgan deb ayta olamiz. Evrika! Dinamik bo’lmagan o’zgaruvchilar stackka joylanib, ish tugagach avtomatik o’chirib yuborilarkan-da deyishga shoshmang, yuqoridagi namunaning 7-qatori(t e’lon qilingan yeri)ni 5-qatordan keyinga ko’chirib, kodni yurgazib ko’ring ;) Stack xususiyatlariga ko’ra, unga lokal o’zgaruvchilar joylanadi, hozirgi aytgan holatimda esa t o’zgaruvchisi global bo’lib qoladi. Uni qayerga berkinib olgani haqida quyiroqda gaplashib o’tamiz.
Stack o’lchami chegaralangan, agar u to’lsa dastur stackoverflow(stack to’lib ketish) xatoligi tufayli crash ga uchraydi. Buni sinab ko’rishga kichik kod yozib ko’ramizmi?
int a[524288];//256*1024*2, bu kod menda xatolik bergan, xohlasangiz a hajmini kattaroq qilib ko’ring

Dastur noma’lum xatolikka uchradi
Stackning chegarasi 1MBlar atrofida bo’ladi, bu narsa OS(operatsion sistema) tomonidan belgilangan bo’ladi. Stackoverflowga yana bir sabab esa funksiya chaqirilganda u ishini tugatmasdan boshqa funksiya(lar)ni, boshqalari ham ishini tugatmasdan yana funksiyalar chaqirish holati. Bunday holat rekursiyada uchraydi, rekursiyadagi funksiyaning o’ziga-o’zi murojaatlar soni oshib ketib, qaytadigan qiymatlar bilan stack to’lib ketishi misol bo’la oladi(Bu haqida batafsil: Rekursiya — C++ da).
Stackdagi xotiradan joy olish chiziqli tartibda amalga oshiriladi. Ya’ni siz biror o’zgaruvchi e’lon qilib, keyin yana boshqa o’zgaruvchi e’lon qilganingizda ular xotirada bir-birlariga “qo’shni” bo’lib qoladi. Buni ham sodda kod bilan test qilib ko’ramiz:
int a, b;
cout<<&a<cout<<(int)&a-(int)&b;

Bunda a va b ning manzillari va ularning ayirmasi ekranga chiqariladi, mening holatimda manzillar quyidagicha://sizda manzillar boshqacha chiqishi mumkin
0x22feac
0x22fea8
4
Ayirma 4 chiqqani sababi a 4 birlikni egallaydi, b esa a ning bosh yacheykasidan 4 birlik keyin joylashadi. Agar & belgisi sizga notanish bo’lsa hozir bu haqida ham gaplashamiz.


Yüklə 117,5 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin