Belgilangan ko'rsatkich - Tagged pointer

Yilda Kompyuter fanlari, a belgilangan ko'rsatkich a ko'rsatgich (aniq bir xotira manzili ) bilan bog'liq bo'lgan qo'shimcha ma'lumotlar bilan, masalan bilvosita bit yoki mos yozuvlar soni. Ushbu qo'shimcha ma'lumotlar tez-tez ko'rsatgichga "katlanmış" bo'ladi, ya'ni manzilni ifodalovchi ma'lumotlarda ichki qatorda saqlanadi, xotira adreslashning ba'zi xususiyatlaridan foydalanadi. Ism "belgilangan arxitektura "har bir so'zning ahamiyatini ko'rsatish uchun apparat darajasida bitlarni ajratib qo'ygan tizimlar; qo'shimcha ma'lumotlar" yorliq "yoki" teglar "deb nomlanadi. turi, boshqa ma'lumotlar emas; ammo, "belgilangan marker" foydalanish hamma joyda mavjud.

Ko'rsatkichga teglarni katlama

Teglarni ko'rsatgichga katlama uchun turli xil texnikalar mavjud.[1][ishonchli manba? ]

Ko'pgina arxitekturalar baytli (eng kichik adreslanadigan birlik bayt), lekin ma'lumotlarning ayrim turlari ko'pincha bo'ladi moslashtirilgan ma'lumotlar hajmiga, ko'pincha a so'z yoki ularning ko'pligi. Ushbu nomuvofiqlik ulardan bir nechtasini qoldiradi eng kam bitlar teglar uchun ishlatilishi mumkin bo'lgan ko'rsatgichning ishlatilmaganligi - ko'pincha bit maydon (har biri alohida teg) - ko'rsatgich ishlatadigan kod ekan niqoblar xotiraga kirishdan oldin bu bitlar. Masalan, a 32-bit arxitektura (ikkala manzil uchun ham, so'z kattaligi uchun), so'z 32 bit = 4 baytni tashkil qiladi, shuning uchun so'zlar bilan moslangan manzillar har doim 4 ga ko'paytiriladi, shuning uchun oxirgi 2 bit mavjud bo'lib, 00 bilan tugaydi; a da 64-bit arxitektura, so'z 64 bit = 8 baytni tashkil qiladi, shuning uchun so'zlar bilan mos manzillar 000 bilan tugaydi va oxirgi 3 bit mavjud bo'ladi. Ma'lumotlar so'zning kattaligiga to'g'ri keladigan holatlarda, bitlardan foydalanish mumkin. Agar bo'lsa so'zga yo'naltirilgan arxitekturalar, so'zlarga mos ma'lumotlar hech qanday bit qoldirmaydi, chunki moslashtirish va adreslash o'rtasida tafovut yo'q, lekin ma'lumotlar bir nechta so'z hajmiga to'g'ri keladi.

Aksincha, ba'zi operatsion tizimlarda, virtual manzillar qoldiradigan umumiy me'morchilik kengligidan torroq eng muhim bitlar teglar uchun mavjud; hizalanan manzillar holatida bu avvalgi texnika bilan birlashtirilishi mumkin. Bu, ayniqsa, 64-bitli arxitekturalarga taalluqlidir, chunki 64 bitli manzil maydoni eng katta dasturlardan tashqari barcha ma'lumotlarning talablaridan yuqori va shuning uchun ko'pchilik amaliy 64-bitli protsessorlar torroq manzillarga ega. E'tibor bering, virtual manzil kengligi nisbatan tor bo'lishi mumkin jismoniy manzil kenglik, bu o'z navbatida me'morchilik kengligidan torroq bo'lishi mumkin; ko'rsatgichlarni belgilash uchun foydalanuvchi maydoni, operatsion tizim tomonidan taqdim etilgan virtual manzil maydoni (o'z navbatida xotirani boshqarish bo'limi ) tegishli kenglik. Darhaqiqat, ba'zi protsessorlar, ayniqsa, protsessor darajasida bunday markirovka qilingan ko'rsatgichlardan foydalanishni taqiqlashadi x86-64, bu foydalanishni talab qiladi kanonik shakl manzillari operatsion tizim tomonidan, eng muhim bitlar 0 yoki 1 sonlar bilan.

Va nihoyat virtual xotira eng zamonaviy tizim operatsion tizimlar 0 manzil atrofida mantiqiy xotira blokini yaroqsiz deb saqlaydi. Bu shuni anglatadiki, masalan, 0 ga ko'rsatuvchi hech qachon haqiqiy ko'rsatuvchi bo'lmaydi va maxsus sifatida ishlatilishi mumkin nol ko'rsatkich qiymat. Yuqorida aytib o'tilgan usullardan farqli o'laroq, bu ko'rsatgichlar uchun qo'shimcha ma'lumot emas, faqat bitta maxsus ko'rsatgich qiymatini beradi.

Misollar

Belgilangan ko'rsatgichlardan foydalanishning muhim namunasi Maqsad-C ish vaqti yoniq iOS 7 kuni ARM64, ayniqsa ishlatilgan iPhone 5S. IOS 7-da virtual manzillar 33 bitni tashkil etadi (baytlar bilan hizalanadi), shuning uchun so'zlar bilan belgilangan manzillar atigi 30 bitdan foydalanadi, teglar uchun 3 bit qoladi. Objective-C sinf ko'rsatgichlari so'zlar bilan moslangan va teg maydonlari ko'pgina maqsadlarda, masalan, mos yozuvlar sonini saqlash va ob'ektda halokatchi.[2][3]

MacOS-ning dastlabki versiyalarida ma'lumotlar moslamalariga havolalarni saqlash uchun Handles deb nomlangan etiketli manzillar ishlatilgan. Manzilning yuqori qismlari ma'lumotlar moslamasi mos ravishda bloklanganligini, tozalanishini va / yoki manba faylidan kelib chiqqanligini ko'rsatdi. Bu MacOS-ning adreslashi tizim 7-da 24 bitdan 32 bitgacha bo'lganida moslik muammolarini keltirib chiqardi.[4]

Nol va hizalanmış ko'rsatkich

Nol ko'rsatkichni ko'rsatish uchun noldan foydalanish juda keng tarqalgan, chunki ko'plab dasturlash tillari (masalan Ada ) ushbu xatti-harakatga aniq ishonish. Nazariy jihatdan, operatsion tizim uchun ajratilgan mantiqiy xotira blokidagi boshqa qiymatlar nol ko'rsatkichdan tashqari shartlarni belgilash uchun ishlatilishi mumkin, ammo bu foydalanish kamdan-kam ko'rinadi, ehtimol ular eng yaxshi ko'chma. Dasturiy ta'minotni ishlab chiqarishda odatda qabul qilingan amaliyot, agar maxsus ko'rsatgich qiymati noldan farq qiladigan bo'lsa (masalan, a qo'riqchi albatta ma'lumotlar tuzilmalari ) kerak bo'lsa, dasturchi buni aniq ko'rsatishi kerak.

Ko'rsatkichlar hizalanmasining afzalliklaridan foydalanish null ko'rsatgichlarga / qo'riqchilarga qaraganda ko'proq moslashuvchanlikni ta'minlaydi, chunki u ko'rsatgichlarga ko'rsatilgan ma'lumotlar turi, ularga kirish mumkin bo'lgan sharoitlar yoki ko'rsatgichdan foydalanish to'g'risidagi boshqa shunga o'xshash ma'lumotlar haqida ma'lumot kiritish imkonini beradi. Ushbu ma'lumot har bir to'g'ri ko'rsatgich bilan birga berilishi mumkin. Aksincha, bo'sh ko'rsatgichlar / sentinellar faqat ko'rsatgichlardan farqli sonli sonli qiymatlarni beradi.

A belgilangan arxitektura, xotiraning har bir so'zida bir nechta bitlar yorliq vazifasini bajarishi uchun ajratilgan. Kabi etiketli arxitekturalar, masalan Lisp mashinalari, tez-tez yorliqli ko'rsatgichlarni talqin qilish va qayta ishlash uchun apparat yordamiga ega.

GNU libc malloc () 32 bitli platformalar uchun 8 baytli va 64 bitli platformalar uchun 16 baytli hizalanadigan xotira manzillarini taqdim etadi.[5] Kattaroq hizalama qiymatlarini posix_memalign () yordamida olish mumkin.[6]

Misollar

1-misol

Quyidagi C kodida nol ko'rsatkich nol ko'rsatkichni ko'rsatish uchun ishlatiladi:

bekor ixtiyoriy_return_a_value (int* ixtiyoriy_return_value_pointer) {  /* ... */  int qaytish qiymati = 1;  / * bu NULL emasmi? (E'tibor bering, NULL, mantiqiy noto'g'ri va nol teng C ga teng) * /  agar (ixtiyoriy_return_value_pointer)    / * agar shunday bo'lsa, uni chaqirish funktsiyasiga qiymat berish uchun foydalaning * /    *ixtiyoriy_return_value_pointer = qaytish qiymati;  / * aks holda, ko'rsatgich hech qachon belgilanmaydi * /}

2-misol

Bu erda dasturchi global o'zgaruvchini taqdim etdi, uning manzili keyinchalik qo'riqchi sifatida ishlatiladi:

# SENTINEL & sentinel_larni aniqlangtugun_t nilufar_;bekor tugunni_bir narsa qilish (tugun_t * p) {  agar (NULL == p)    /* biror narsa qilmoq */  boshqa agar (SENTINEL == p)    / * boshqa narsa qilish * /  boshqa    / * tugunni to'g'ri ko'rsatgich sifatida ko'rib chiqing * /}

3-misol

Bizda ma'lumotlar tuzilishi bor deb taxmin qiling stol_kirish har doim 16 baytli chegaraga to'g'ri keladi. Boshqacha qilib aytganda, jadval yozuvlari manzilining eng kichik 4 biti har doim 0 (). Qo'shimcha ma'lumotlar bilan jadval yozuvini belgilash uchun ushbu 4 bitdan foydalanishimiz mumkin. Masalan, 0 biti faqat o'qishni, bit 1 iflosni anglatishi mumkin (jadval yozuvini yangilash kerak) va hokazo.

Agar ko'rsatkichlar 16-bitli qiymatlar bo'lsa, unda:

  • 0x3421 faqat o'qish uchun ko'rsatgichdir stol_kirish manzil bo'yicha 0x3420
  • 0xf472 iflos bo'lgan ko'rsatkichdir stol_kirish manzil bo'yicha 0xf470

Afzalliklari

Belgilangan ko'rsatgichlarning asosiy afzalligi shundaki, ular alohida yorliq maydoni bilan birga ko'rsatgichga qaraganda kamroq joy egallaydi. Bu, ayniqsa, ko'rsatgich a-dan qaytish qiymati bo'lganida juda muhim bo'lishi mumkin funktsiya. Ko'rsatkichlarning katta jadvallarida ham muhim bo'lishi mumkin.

Nozik afzalligi shundaki, tegni ko'rsatgich bilan bir joyda saqlagan holda, ko'pincha kafolat berish mumkin atomlik ikkala ko'rsatgichni va uning yorlig'ini tashqi holda yangilaydigan operatsiya sinxronizatsiya mexanizmlar. Bu, ayniqsa, operatsion tizimlarda juda katta ishlash yutug'i bo'lishi mumkin.

Kamchiliklari

Belgilangan ko'rsatkichlar ba'zi bir xil qiyinchiliklarga ega bog'langan ro'yxatlar, garchi ozgina bo'lsa ham. Masalan, barchasi hammasi emas tuzatuvchilar belgilangan ko'rsatkichlarni to'g'ri kuzatib borish imkoniyatiga ega bo'ladi; ammo, bu belgilab qo'yilgan ko'rsatgichlarni hisobga olgan holda tuzatuvchi uchun muammo emas.

Nol ko'rsatkichni ko'rsatish uchun noldan foydalanish bu kamchiliklarga duch kelmaydi: u keng tarqalgan, dasturlash tillarining aksariyati nolga maxsus nol qiymat sifatida qaraydi va u o'zining mustahkamligini yaxshilab isbotladi. Istisno - bu nolning ishtirok etish usuli ortiqcha yuk piksellar sonini C ++ da, bu erda nol ko'rsatkich emas, balki butun son sifatida qabul qilinadi; shu sababli alohida qiymat nullptr tamsayı nolga nisbatan afzaldir. Biroq, belgilangan ko'rsatkichlar bilan nol ko'rsatkichlar odatda nol ko'rsatkichlarni ko'rsatish uchun ishlatilmaydi.

Adabiyotlar

  1. ^ Juma kuni savol-javob 2012-07-27: Keling, belgilab qo'yilgan ko'rsatgichlarni yarataylik, Mayk Ash tomonidan
  2. ^ Juma kuni savol-javob 2013-09-27: ARM64 va siz, Mayk Ash tomonidan
  3. ^ [objc tushuntirish]: ko'rsatgich bo'lmagan isa
  4. ^ Bricknell, K. J. Macintosh C: Mac OS operatsion tizimini dasturlash bo'yicha havaskorlar uchun qo'llanma.
  5. ^ "Malloc misollari". GNU C kutubxonasi. Olingan 5 sentyabr 2018.
  6. ^ posix_memalign (3) – Linux Dasturchi Qo'lda - kutubxonaning vazifalari