C strukturani to‘ldirish (padding)


ULASHISH

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‘zingiz sinab ko‘ring »

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; }

O‘zingiz sinab ko‘ring »

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

O‘zingiz sinab ko‘ring »

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!