7-bo‘lim

Xotira, manzillar va bayt tartibi

Xotira baytlar massivi sifatida, katta va kichik bayt tartibi, bir xil baytlarni turlicha o'qish va tuzilmalarni tekislash.

🕑 8 daqiqa o‘qish 📄 1 138 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ikki xil tartib
  2. Nima uchun bu muhim
  3. Tekislash va tuzilma hajmi
  4. Xulosa

Xotira - bu shunchaki raqamlangan kataklar massivi. Har katak bitta bayt, har baytning manzili bor.

Bitta baytdan katta son esa bir necha katakka yoziladi. Va shu yerda kutilmagan savol chiqadi: qaysi tartibda?

Ikki xil tartib #

0x12345678 xotirada manzil katta tartib kichik tartib +0 0x12 0x78 +1 0x34 0x56 +2 0x56 0x34 +3 0x78 0x12 tarmoq, PNG, Java x86, ARM, RISC-V Ikkalasi ham to'g'ri - bu shunchaki kelishuv. Muhimi: tartibni ANIQ belgilang.
Bir xil son, ikki xil joylashuv - va jimgina xato manbai

0x12345678 sonini olaylik. U to'rt baytdan iborat: 12, 34, 56, 78. Savol - ular xotiraga qaysi tartibda yoziladi?

TartibBaytlar
Katta (big-endian)12 34 56 78
Kichik (little-endian)78 56 34 12

Manzillar bo'yicha yoyib ko'rsak:

ManzilKatta tartibdaKichik tartibda
+00x120x78
+10x340x56
+20x560x34
+30x780x12

Katta tartibda son odam o'qiganidek yoziladi - eng katta bayt oldinda. Kichik tartibda esa teskari.

Bugungi kompyuterlarning aksariyati (Intel, AMD va odatdagi holatda ARM) kichik tartibni ishlatadi.

Ikkalasi ham to'g'ri - shunchaki ikki xil kelishuv:

TartibBirinchi baytdaKim ishlatadi
Katta (big-endian)Eng muhim baytTarmoq protokollari, PNG, Java
Kichik (little-endian)Eng kichik baytx86, ARM, RISC-V, BMP
"Endian" so'zi Sviftning romanidan olingan

1980-yilda Denni Koen "On Holy Wars and a Plea for Peace" nomli maqola yozdi va atamani Jonatan Sviftning "Gulliverning sayohatlari" asaridan oldi.

Romanda ikki davlat tuxumni qaysi tomondan - yo'g'on (big end) yoki ingichka (little end) - chaqish kerakligi ustida urushadi.

Koen shu bilan aytmoqchi ediki: bahs mazmunsiz, muhimi - kelishib olish. Qaysi tartib "to'g'ri" degan savolning javobi yo'q.

Qiziq: x86 kichik tartibni ishlatadi, internet esa katta tartibni. Shuning uchun har paket yuborilganda baytlar o'giriladi.

Nima uchun bu muhim #

Tarmoqdan to'rt bayt keldi: 00 00 04 d2. Ularni son deb o'qiymiz:

Qanday o'qildiNatija
Katta tartibda (to'g'ri)1234
Kichik tartibda (xato)3 523 477 504

Farq - uch milliarddan ortiq. Va eng yomoni shundaki, bu xato jimgina yuz beradi: hech qanday ogohlantirish chiqmaydi, dastur shunchaki noto'g'ri son bilan ishlayveradi.

Shuning uchun tartib oldindan kelishib olinadi:

QayerdaQaysi tartib
Tarmoq protokollarihar doim katta
PNG fayl formatikatta
BMP fayl formatikichik
Intel va AMD protsessorlarikichik

Yana bir misol: 41 42 43 44 baytlarini turlicha o'qish mumkin, va har safar boshqa natija chiqadi:

Qanday o'qildiNatija
Matn sifatidaABCD
Katta tartibdagi son1 094 861 636
Kichik tartibdagi son1 145 258 561
Ikkita 2 baytli son16 706 va 17 220
To'rtta alohida bayt65, 66, 67, 68

Baytlarning o'zida ma'no yo'q. Ma'no - ularni qanday o'qishga kelishib olganingizda.

Oxirgi blok eng muhim xulosani beradi: baytlarning o'zida ma'no yo'q.

41 42 43 44 - bu ABCD matnimi, 1094861636 soni-mi yoki ikkita kichik son-mi? Javob faqat bitta narsaga bog'liq: siz uni qanday o'qiysiz.

Tur (type) aynan shu ma'lumotni beradi - baytlarni qanday talqin qilish kerakligini.

Bayt tartibi xatosi jimgina yuz beradi

Yuqoridagi misolda 1234 o'rniga 3523477504 chiqdi.

Dastur yiqilmadi, xato bermadi - shunchaki noto'g'ri son bilan ishlashda davom etdi.

Bunday xatolar eng qimmatga tushadi. Himoya usullari:

ChoraIzoh
! yoki > ni aniq yozingHech qachon tartibni faraz qilmang
Qiymat diapazonini tekshiringKutilmagan katta son - belgi
Sinov ma'lumotini ikkala tartibda o'qingQaysi biri mantiqli ekani ko'rinadi

Fayl formatlarida ko'pincha sehrli son (magic number) boshida turadi - u ham tartibni aniqlashga yordam beradi.

Tekislash va tuzilma hajmi #

Protsessor xotiradan 8 baytli sonni 8 ga karrali manzildan o'qiganda tez ishlaydi. Shuning uchun kompilyator maydonlar orasiga bo'sh joy qoldiradi.

Uchta qismdan iborat tuzilmani olaylik:

QismHajmi
Belgi1 bayt
Butun son4 bayt
Haqiqiy son8 bayt
Yig'indi13 bayt

Mantiqan tuzilma 13 bayt bo'lishi kerak. Amalda esa uning hajmi qismlar tartibiga bog'liq:

TartibHaqiqiy hajmNazariy hajmBaho
belgi, haqiqiy, butun20 bayt13eng yomon
belgi, butun, haqiqiy16 bayt13yomon
haqiqiy, butun, belgi13 bayt13eng yaxshi

Sabab - tekislash:

Bir xil qismlar, ikki xil tartib eng yomon b 7 bayt BO'SH haqiqiy son (8 bayt) butun (4) 20 B 0 8 16 Haqiqiy son 8 ga karrali manzildan boshlanishi kerak - shuning uchun 7 bayt bekor ketdi eng yaxshi haqiqiy son (8 bayt) butun (4) b 13 B 0 8 12 Kattadan kichikka tartiblansa - birorta bayt bekor ketmaydi Nima uchun tekislash kerak? Protsessor 8 baytli sonni 8 ga karrali manzildan bir marta o'qiydi Manzil karrali bo'lmasa - ikki marta o'qib, natijani yopishtirish kerak Tezlik uchun joy qurbon qilinadi
Maydonlarni kattadan kichikka tartiblash - bepul tejash usuli

Amaliy xulosa sodda: tuzilmadagi maydonlarni kattadan kichikka tartiblang. Bu hech narsa talab qilmaydi, lekin millionlab yozuvda sezilarli joy tejaydi.

Bu bepul optimallashtirish

Maydonlar tartibini o'zgartirish hech narsaga to'lamaydi: kod bir xil, mantiq bir xil, faqat e'lon tartibi boshqa.

Millionlab yozuvli massivda bu sezilarli tejash beradi - ham xotira, ham kesh bo'yicha (14-bo'limda ko'ramiz).

Qoida sodda: kattadan kichikka tartiblang.

Rust va Go kompilyatorlari ba'zan buni o'zi qiladi, C va C++ esa sizning tartibingizni saqlaydi - chunki tuzilma tashqi formatga mos kelishi kerak bo'lishi mumkin.

Aynan shuning uchun fayl yoki tarmoq formatini tavsiflaganda tekislashni o'chirish kerak bo'ladi: u yerda har bayt aniq belgilangan o'rinda turishi shart va qo'shimcha bo'sh baytlar formatni buzadi.

Tekislanmagan murojaat - ba'zi protsessorlarda xato

x86 tekislanmagan manzildan o'qishga ruxsat beradi, faqat sekinroq ishlaydi.

Lekin ba'zi ARM va ko'p o'rnatilgan protsessorlarda bu dastur qulashiga olib keladi (bus error).

Bu klassik "mening mashinamda ishlayapti" holati: kod x86 da yillab ishlaydi, keyin boshqa arxitekturaga ko'chirilganda darhol yiqiladi.

Shuning uchun xotiradagi xom baytlarni to'g'ridan-to'g'ri tuzilma deb o'qish xavfli. Ularni nusxalab, keyin o'qish ancha ishonchli.

Amaliy topshiriq
  1. 0xDEADBEEF ni ikkala bayt tartibida yozib chiqing.
  2. Sizning kompyuteringiz qaysi tartibda ishlaydi? Toping.
  3. 00 00 04 d2 baytlarini ikkala tartibda son qilib o'qing.
  4. Nima uchun tarmoqda katta tartib tanlanganini ayting.
  5. 41 42 43 44 ni matn va son sifatida o'qib, farqni yozing.
  6. Belgi, butun va haqiqiy sondan iborat tuzilmani eng zich tartibda joylang.
  7. Unga 2 baytli son qo'shilsa, tartib qanday o'zgaradi?
  8. Nima uchun tekislash tezlik beradi - uch qatorda yozing.
  9. PNG faylining birinchi 8 baytini o'qib, sehrli sonni toping.
  10. Nima uchun bir xil baytlar turli ma'no berishini tushuntiring.

Xulosa #

  • Xotira - raqamlangan baytlar massivi; har baytning manzili bor.
  • Ko'p baytli son ikki xil tartibda yozilishi mumkin: katta va kichik.
  • Ikkalasi ham to'g'ri - bu shunchaki kelishuv.
  • x86 va ARM kichik tartibni, tarmoq protokollari esa katta tartibni ishlatadi.
  • "Endian" atamasi Sviftning romanidan olingan: bahs mazmunsiz, kelishuv muhim.
  • Bayt tartibi xatosi jimgina yuz beradi - dastur yiqilmaydi, faqat noto'g'ri ishlaydi.
  • Baytlarning o'zida ma'no yo'q - tur ularni qanday o'qishni aytadi.
  • Protsessor tekislangan manzillardan tez o'qiydi.
  • Shuning uchun tuzilma hajmi maydonlar tartibiga bog'liq.
  • Maydonlarni kattadan kichikka tartiblang - bu bepul tejash.

Keyingi bo'limda eng pastki qatlamga tushamiz: mantiqiy elementlardan sumator quramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.