Bit maydonlar
Bit maydonlar – bu struktura maydonlarining maxsus turi. Ular ma'lumotlarni zich joylashtirish uchun ishlatiladi, masalan, ha / yo'q tipidagi bayroqchalar. Minimal adreslanadigan xotira yacheykasi – 1 bayt bayroqchani saqlash uchun bit yetarli. Bit maydonlarni tavsiflashda nomdan so'ng ikki nuqta orqali maydon uzunligi bitlarda ko’rsatiladi (butun musbat konstanta):
struct Options{
bool centerX:1;
bool centerY:1;
unsigned int shadow:2;
unsigned int palette:4;
};
Bit maydonlar ixtiyoriy butun tipda bo'lishi mumkin. Maydon nomi bo'lmasligi mumkin, bunday maydonlar apparat chegarasiga to'g'rilash uchun xizmat qiladi. Maydoncha kirish oddiy usul bilan amalga oshadi – nom bo'yicha. Maydon adresini olish mumkin emas, lekin qolgan hollarda bit maydonlarni strukturaning maydonlari kabi foydalanish mumkin. Alohida bitlar bilan amallar ancha samarasiz amalga oshadi, chunki kompilyator maxsus kodlarni hosil qilish va o'zgaruvchiga xotirani tejash dastur kodi hajmining oshishiga olib keladi. Bit maydonlar xotirada joylashtirish kompilyator va apparaturaga bog'liq.
Birlashmalar (union)
Birlashmalar (union) struktura xususiy holi bo'lib, uning barcha maydonlari bitta adresga joylashadi. Tavsiflash formati strukturadagi kabi faqat struct tayanch so'zi o'rniga union so'zi ishlatiladi. Birlashma uzunligi uning maydonlari uzunliklari eng kattasiga teng har bir vaqt momentida birlashma tipidagi o'zgaruvchida faqat bitta qiymat saqlanadi va undan to'g'ri foydalanish ma'suliyati dasturchi zimmasiga tushadi.
Birlashmalar xotirani tejash uchun bittadan ko'p maydon talab qilinmaydigan hollarda qo'llaniladi:
#include
int main () {
enum paytype {CARD, CHECK};
paytype ptype;
union payment {
char card[25];
long check;
} info;
/* присваивание значений info и ptype */
switch (ptype) {
case CARD: cout << "Kartadan to'lash: " << info.card; break;
case CHECK: cout << "Chekni to'lash: " << info.check; break;
}
return 0;
}
Birlashmalar ko'pincha struktura maydoni sifatida foydalaniladi, bunda strukturaga birlashgan qanday elementi har bir momentda foydalanilayotganligi aniqlovchi qo'shimcha maydonni kiritish qulay. Birlashmalar nomini ko'rsatish shart emas, bu esa uning maydonlariga bevosita murojaat qilishga imkon beradi:
#include
int main () {
enum paytype {CARD, CHECK};
srtuct{
paytype ptype;
union{
char card[25];
long check;
};
} info;
… /* присваивание значений info */
switch (info.ptype) {
case CARD: cout << "Kartadan to'lash: " << info.card; break;
case CHECK: cout << "Chekni to'lash: " << info.check; break;
}
return 0;
}
Birlashmalar bir xil bit tasvirlashning turlicha talqini uchun qo'llaniladi (lekin, odatda, bu holda tiplarni almashtirish oshkora amallardan foydalanish yaxshi). Misol sifatida bit maydonlar o'z ichiga oluvchi struktura bilan ishlashni qaraymiz:
struct Options{
bool centerX:1;
bool centerY:1;
unsigned int shadow:2;
unsigned int palette:4;
};
union{
unsigned char ch;
Options bit;
}option = {0xC4};
cout << option.bit.palette;
option.ch &= 0xF0; // maskalar qiymati
Strukturalarga qaraganda birlashmalarga ba'zi cheklovlar qo'yiladi. Ularning ba'zilari ma'nosi keyinchalik tushunarli bo'ladi:
birlashma faqat uning birinchi elementi bilan initsializatsiyalanishi mumkin;
birlashma bir maydonlarni o'z ichiga ololmaydi;
birlashma virtual usullarni, konstruktorlarni, destruktorlarni va qiymat berishni o'z ichiga olomaydi;
birlashma sinflar iyerarxiyasiga kira olmaydi.
Do'stlaringiz bilan baham: |