C strukturani to‘ldirish (padding)
Strukturani to‘ldirish (padding)
C tilida struktura (struct) yaratganingizda, kompilyator a’zolar orasiga qo‘shimcha to‘ldiruvchi baytlar (padding) qo‘shishi mumkin.
Bu dastur kompyuteringizda tezroq ishlashi uchun qilinadi, chunki ko‘pchilik protsessorlar ma’lumotlarni xotirada to‘g‘ri tekislangan bo‘lganda samaraliroq o‘qiydi.
Agar past darajadagi xotira yoki fayl formatlari bilan ishlamasangiz, bu haqda kamdan-kam qayg‘urishingizga to‘g‘ri keladi.
Qisqacha aytganda: padding — ishlar tez bo‘lishi va ma’lumotlar xotirada to‘g‘ri tekislanishi uchun kompilyator ba’zan struktura ichiga bo‘sh joylar qo‘shishidir.
Oddiy strukturani ko‘rib chiqaylik:
Misol
struct Example {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
};
int main() {
printf("Size of struct: %zu bytes\n", sizeof(struct Example));
return 0;
}
O‘lcham 1 + 4 + 1 = 6 bytes bo‘ladi deb kutishingiz mumkin — lekin odatda 12 bayt chiqadi!
Nega?
Kompilyator int a’zosi (b) 4 ga karrali xotira manzilidan boshlanishi uchun to‘ldiruvchi baytlar qo‘shadi. Bu protsessorga uni tezroq o‘qishga yordam beradi.
Xotira aslida quyidagicha joylashadi:
| A’zo | Baytlar | Eslatmalar |
|---|---|---|
| a | 1 | Birinchi saqlanadi |
| to‘ldirish (padding) | 3 | b 4 ga karrali manzildan boshlanishi uchun qo‘shilgan |
| b | 4 | 4 baytlik chegaraga tekislangan |
| c | 1 | Keyin saqlanadi |
| to‘ldirish (padding) | 3 | Umumiy o‘lcham 4 ga karrali bo‘lishi uchun qo‘shilgan |
Jami = 1 + 3 + 4 + 1 + 3 = 12 bayt.
To‘ldirishni (padding) qanday kamaytirish mumkin
Padding strukturadagi a’zolarning tartibiga bog‘liq. Agar avval kattaroq tiplarni guruhlasangiz, strukturani kichikroq qilishingiz mumkin:
Misol
struct Example {
int b; // 4 bytes
char a; // 1 byte
char c; // 1 byte
};
int main() {
printf("Size of struct: %zu bytes\n", sizeof(struct Example)); // Usually 8 bytes
return 0;
}
Endi struktura 12 emas, atigi 8 bayt, chunki kamroq padding kerak bo‘ladi.
Bu nima uchun muhim
- Padding ma’lumotlarni xotirada tekislangan holda saqlab, dasturlarning tezroq ishlashiga yordam beradi.
- U strukturalarni kutilganidan kattaroq qilishi mumkin.
- A’zolar tartibini o‘zgartirish umumiy o‘lchamni kamaytirishi mumkin.
- Eslatma: Agar past darajadagi xotira yoki fayl formatlari bilan ishlamasangiz, bu haqda kamdan-kam qayg‘urishingizga to‘g‘ri keladi.
Strukturalar va union’lar
Hozirgacha strukturalar ichidagi padding haqida gapirdik. Union’lar haqida nima deyish mumkin?
Union’lar barcha a’zolarni bitta xotira joyida saqlaydi, shuning uchun a’zolar orasida padding bo‘lmaydi. Biroq strukturalar ham, union’lar ham tekislash qoidalariga amal qiladi — ma’lumotlar o‘z tipi o‘lchamiga mos xotira manzillaridan boshlanishi kerak.
Misol
struct S {
char a;
int b;
char c;
};
union U {
char a;
int b;
char c;
};
int main() {
printf("Struct size: %zu\n", sizeof(struct S));
printf("Union size: %zu\n", sizeof(union U));
return 0;
}
Odatdagi natija:
Struct size: 12
Union size: 4
Izoh:
- Struct — a’zolar ketma-ket saqlanadi, shuning uchun ular orasiga padding qo‘shiladi.
- Union — barcha a’zolar bitta xotirani birgalikda ishlatadi, shuning uchun umumiy o‘lchamni faqat eng katta a’zo belgilaydi.
| Xususiyat | Struct | Union |
|---|---|---|
| A’zolarning saqlanishi | Ketma-ket | Barchasi bitta xotira maydonini birgalikda ishlatadi |
| A’zolar orasidagi padding | Ha | Yo‘q |
| Tekislash asosi | Har bir a’zoning tipi | Eng katta a’zoning tipi |
| Umumiy o‘lcham | A’zolar yig‘indisi + padding | Eng katta a’zoning o‘lchami |
Maslahat: Odatda bu haqda qayg‘urishingiz shart emas, lekin nima uchun strukturalar ba’zan kutilganidan ko‘proq xotira egallashini, union’lar esa egallamasligini bilish foydali.
Xulosa
- Struktura a’zolari o‘z ma’lumot tipining o‘lchamiga qarab tekislanadi.
- Ma’lumotlarni to‘g‘ri tekislash uchun kompilyator to‘ldiruvchi baytlar (padding) qo‘shishi mumkin.
- Strukturaning umumiy o‘lchami ko‘pincha a’zolari o‘lchamlari yig‘indisidan katta bo‘ladi.
- A’zolar tartibini o‘zgartirish to‘ldirishni (padding) kamaytirib, xotirani tejashi mumkin.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
