Struct va union
Last updated
Last updated
struct
nima va qanday ishlatiladi?struct
(structure) — bu bir nechta o'zgaruvchilarni bitta guruhga birlashtirish imkonini beruvchi ma'lumotlar tuzilmasi. struct
bizga har xil turdagi o'zgaruvchilarni birgalikda ishlatish uchun qulay imkoniyat yaratadi. Masalan, odamning ismi, yoshi va bo'yi kabi turli xildagi o'zgaruvchilarni bitta tuzilma (structure) orqali birlashtirishimiz mumkin.
struct
asosan ma'lumotlarni tartibli ko'rinishda saqlashda foydalaniladi. Bu ma'lumotlar guruhini toza va aniq ko'rinishda tutishga yordam beradi. C dasturlash tilida struct quyidagi ko'rinishda e'lon qilinadi:
Yuqoridagi misolda biz bir odam haqida ma'lumotlarni saqlash uchun struct Odam
nomli tuzilmani yaratdik. Ushbu struct
ichida ism (char ism[50]
), yosh (int yosh
) va bo'yi (float boi
) kabi maydonlar mavjud.
Endi, struct'ni qanday ishlatishni amaliy misol orqali ko'rib chiqamiz:
Kodning tahlili:
struct Odam
: Bu tuzilma char ism[50]
, int yosh
, va float boi
o'zgaruvchilarini bir guruhga birlashtiradi.
odam1
: Odam
turidagi o'zgaruvchi yaratiladi.
scanf
: Kiritilgan qiymatlar odam1 structining maydonlariga joylashtiriladi.
printf
: Struct maydonlari ekranga chiqariladi.
union
nima va qanday ishlatiladi ?union
— bir necha o'zgaruvchilarni bitta joyda, bir vaqtning o'zida faqat bitta qiymat saqlanishi mumkin bo'lgan tuzilma. Ya'ni, union
da barcha maydonlar bitta xotira manzili bo'lib, ulardan faqat birida qiymat saqlanishi mumkin. Har bir maydon bir xil joyda saqlanganligi uchun, u eng katta o'zgaruvchining hajmiga teng bo'ladi.
Masalan, agar union
ichida int
, float
va char[20]
tursa, u holda union
xotirasi bu uchta o'zgaruvchidan kattaroq bo'lganini oladi, lekin faqat bittasida qiymat saqlanadi.
Unionning struktura bilan farqi shundaki, struct'lar bir nechta maydonlarni bir vaqtda ishlatishi mumkin, union esa bir vaqtning o'zida faqat bitta maydonni ishlatadi.
Yuqoridagi misolda Data
nomli union bir vaqtning o'zida yoki int i
, yoki float f
, yoki char str[20]
maydonlaridan faqat birini saqlashi mumkin.
Kodning tahlili:
union Data
: Bu union ichida int i
, float f
, va char str[20]
o'zgaruvchilar bir joyda saqlanadi.
data.i = 10
: Bu qiymat i
maydoniga yuklanadi, ammo keyinroq f
yoki str
maydoniga yangi qiymat berilsa, avvalgi qiymat yo'qoladi.
struct
va union
o'rtasidagi farqlar:GCC kompilyatori orqali struct va union bilan ishlash odatiy C dasturlashida bo'lgani kabi oddiy. Kompilyatsiya uchun quyidagi buyruqdan foydalanishingiz mumkin:
Bu erda struct_union.c
faylda yozgan kodimiz bo'lib, kompilyator uni struct_union
nomli bajariladigan faylga aylantiradi. Keyin esa bu faylni ishga tushirib, struct va union misollarini ko'rish mumkin.
Keling, struktura (struct) va uniya (union) farqlarini kod misollari bilan birgalikda tushuntirib chiqamiz.
Struct
va Union
ning asosiy farqlari:Xotira:
Struct
: Har bir maydon uchun alohida xotira ajratiladi.
Union
: Barcha maydonlar uchun bitta xotira ajratiladi.
Xotira hajmi:
Struct
: Har bir maydonning hajmi qo‘shiladi.
Union
: Eng katta maydonning hajmi ajratiladi.
Saqlash:
Struct
: Bir vaqtning o‘zida bir nechta maydon saqlanishi mumkin.
Union
: Bir vaqtning o‘zida faqat bitta maydon saqlanishi mumkin.
Qatorlarning tahlili:
struct Odam
: Bu tuzilma orqali odamning ism, yosh va bo'yi kabi ma'lumotlari bir joyda saqlanadi.
scanf
: Foydalanuvchidan qiymatlarni kiritadi va structdagi maydonlarga joylaydi.
printf
: Struct maydonlari ekranga chiqariladi.
Qatorlarning tahlili:
union Data
: Union orqali bir vaqtning o‘zida faqat bitta qiymat saqlanadi.
data.i
, data.f
, data.str
: Ularning har biri bir vaqtning o‘zida faqat bir qiymatni saqlaydi, shuning uchun avvalgi qiymatlar o‘chadi.
Struct va Union o‘rtasidagi asosiy farqlar shundan iborat. Union xotira tejash uchun mos bo‘lib, bir vaqtning o‘zida faqat bitta qiymat ishlatiladi, Struct esa ko‘p qiymatni saqlash va foydalanish uchun qulay.
Misol uchun.
C dasturlash tilidagi struct
bilan ishlaganda, har bir element o'zining tabiiy hajmiga mos keladigan xotira hajmini egallaydi. Biroq, kompilyator samaradorlikni oshirish uchun qo'shimcha bo'sh xotira baytlarini hizalash uchun qo'shishi mumkin. Bu hizalanish protsessorning tezroq ishlashiga yordam beradi.
Misolda:
Umumiy elementlar hajmi: 18 bayt.
Hizalash uchun qo'shilgan bo'sh xotira: 6 bayt.
Umumiy hajm: 24 bayt.
Kodda sizeof(address)
funksiyasi bilan natijada 24 bayt chop etiladi.
Xotira hizalanishi sababli qo'shilgan bo'sh joy, har bir element o'zining tabiiy xotira manzillari bo'yicha hizalanishini ta'minlaydi. Bu esa protsessorning xotiraga murojaat qilish tezligini oshiradi.
Hizalanish (alignment) — bu xotira joylashuvi jarayonida ma'lumotlar to'g'ri hizalanishi uchun qo'shimcha xotira baytlarining qo'shilishi jarayoni. Har bir ma'lumot turi (masalan, int
, char
, long
) ma'lum bir xotira bo'shlig'iga joylashtiriladi va hizalanishi kerak bo'lgan baytlar soni protsessor talablariga mos keladi.
Masalan, 4 byte o'lchamidagi int
turidagi ma'lumot to'g'ri hizalanishi uchun 4 byte'lik manzilga joylashtirilishi kerak. Agar hizalanmagan bo'lsa, bu protsessorning ma'lumotni tez ishlov berishini sekinlashtiradi.
Shuning uchun, kompilyator bo'sh joy qo'shib, elementlarni hizalashni to'g'ri amalga oshiradi, bu esa umumiy xotira hajmini oshiradi.
GCC kompilyatorida aliegnment: Kompilyator qo'shimcha bo'sh joyni qo'shib, long
va int
kabi kattaroq turlarning to'g'ri hizalanishini ta'minlaydi.
Hajmni o'lchash uchun sizeof()
funksiyasidan foydalaniladi va natija 24 byte bo'ladi, chunki kompilyator hizalash uchun qo'shimcha joy qo'shadi.
Struct
Union
Xotira
Har bir maydon uchun alohida xotira ajratadi.
Barcha maydonlar uchun bitta xotira ajratiladi.
Saqlash
Barcha maydonlar bir vaqtda ishlatilishi mumkin.
Bir vaqtning o'zida faqat bitta maydon ishlatiladi.
Xotira hajmi
Har bir maydonning xotira hajmi umumiy yig'indisi hisoblanadi.
Eng katta maydonning hajmi bilan belgilanadi.
Qo'llanish
Ko'p turdagi ma'lumotlarni bir joyda saqlash va ularni parallel ishlatishda.
Xotira tejash kerak bo'lgan hollarda, bir nechta qiymat ishlatishda.
Struct
Union
Xotira ajratilishi
Har bir maydon uchun alohida
Eng katta maydon uchun
Saqlash imkoniyati
Har bir maydon bir vaqtda mavjud bo'lishi mumkin
Bir vaqtning o‘zida faqat bitta maydon
Qo'llanishi
Katta ma'lumotlarni parallel ishlatishda
Xotirani tejash uchun