Stack, Heap va ko’rsatgichlar Rust da juda ham muhim hisoblanadi.
Stack va Heap o’zida xotira saqlaydigan joylardan hisoblanadi. Ularning orasidagi asosiy farqlar bu:
- Stack, Heap ga qaraganda tezroq ishlaydi lekin bu bilan Heap ni juda sekin ishlaydi ham deya olmaymiz. Lekin Stack tezroq bo’lgani uchungina uni har doim ham ishlata olmaymiz, sababi:
- Rust har doim kompilyatsiya vaqtida yaratilayotgan o’zgaruvchining aniq hajmini bilishi kerak.Oddiy o’zgaruvchilar uchun, i32 ga o’xshash, bu narsa umuman muammo tug’dirmaydi. sababi biz ularning aniq hajmini bilamiz. i32 ning hajmi har doim 4 bayt hisoblanadi negaki 32 bit =4 bayt ga teng. Shuning uchun ham i32 stack ga joylashtiriladi.
- Lekin ba’zida ,kompilyatsiya vaqtida, biz o’zgaruvchining hajmini bilmasligimiz ham mumkin. Lekin stack ga joylashtirishimiz uchun aniq hajmini bilishimiz kerak, shuning uchun ham biz eng birinchi bo’lib Heap ga joylashtiramiz. Heap istalgan hajm band qilishi mumkin, shuning uchun ham biz keyin ko’rsatgichni(pointer) stack ga joylashtiramiz. Sababi ko’rsatgichning aniq hajmi oldindan ma’lum lekin heap niki emas. Qachonki, bizga heap dagi ma’lumot kerak bo’ladigan bo’lsa, kompyuter oldin stack ni o’qiydi va u yeradi ko’rsatgich beradigan xotira adresiga asoslanib heap dagi ma’lumotni oladi.
Ko’rsatgichlar(pointers) boshida qiyindek tuyulishi mumkin, lekin aslida esa ular juda oddiy, ular huddi kitobdagi mundarijaga o’xshaydi. Misol uchun:
MY BOOK
TABLE OF CONTENTS
Chapter Page
Chapter 1: My life 1
Chapter 2: My cat 15
Chapter 3: My job 23
Chapter 4: My family 30
Chapter 5: Future plans 43
Bu yerdagi har bir “chapter”ni biz aytayotgan ko’rsatgich kabi tasavvur qilsa bo’ladi. Ularga qarab, aynan shu bo’lib qayti betda joylashganini bilsak bo’ladi.
Misol uchun tepadagi mundarijadan ko’rsak bo’ladiki, “My Life” bo’limi 1-betda joylaygan, ya’ni My Life bo’limi 1 chi betga ko’rsatadi(point qiladi).
Biz Rust da uchratadigan ko’rsatgichlar odatda “reference” deb nomlanadi.Eng muhim jihatlaridan biri shuki: reference bu ma’lum bir xotiradagi joyga ko’rsatgich hisoblanadi. Reference da biz qiymatni “foydalanish uchun qarzga olamiz” va uni egasi hisoblanmaymiz. Rust dan dasturlayotganimizda reference larning oldida “&” belgisi ham turadi.
let my_variable = 8odatiy o’zgaruvchi yaradilet my_reference = &my_variablebu yerda esa reference olayabmiz.
Bu yerda biz “my_reference, my_variable o’zgaruvchisiga reference sifatida bo’ladi.
Ya’ni, my_reference faqatgina my_variable dagi qiymatni qarzga olganday hisoblaymi va bu yerda my_variable hali ham qiymat egasi hisoblanaveradi.
Biz reference ga ham reference bera olamiz. Ya’ni qarz olgan o’zgaruvchidan ham boshqa bir o’zgaruvchi qarz olishi mumkin.
fn main() {
let my_number = 15; // Bui32
let single_reference = &my_number; // Bu birinchi reference &i32
let double_reference = &single_reference; // Bu esa ikkinchi reference &&i32
let five_references = &&&&&my_number; // Bu yerda yana reference olamiz &&&&&i32
}
Misol uchun tepada biz 4 xil o’zgaruvchini ko’rishimiz mumkin va ularning har birini ma’lumot turi har xil hisoblanadi.
Leave a Reply