Middle+
Харита (накарда) дар Golang чанд байт мегирад?
sobes.tech AI
Ҷавоб аз AI
Ҳаҷми харита дар Golang тағйирёбанда аст ва аз бисёр омилҳо вобаста аст:
- Санади элементҳо: Ҳамон қадаре ки элементҳо зиёдтар бошанд, ҳамон қадар ёдгирӣ барои нигоҳдории онҳо бештар аст.
- Андозаи калидҳо ва арзишҳо: Ҳар як калид ва арзиш ёдгириро ишғол мекунад. Сатрҳо, слайсҳо, структураҳо — ҳама инҳо ба андозаи умумӣ таъсир мерасонанд.
- Маълумоти ёрирасони сохтори
hmap: харита ишора ба сохториhmapаст. Ин структура дорои майдонҳои ёрирасон аст:- ҳисобкунаки элементҳо
- ишораҳо ба косаҳо (buckets)
- ҳисобкунаки муҳоҷираҳо (боло рафтан/падолуд кардан)
- ва дигар метадатаҳо
- Андозаи косаҳо (buckets): элементҳо дар косаҳо нигоҳ дошта мешаванд. Ҳар коса андозаи муайян дорад (одатан 8 ҷуфт калид-арзиш), аммо маълумоти калидҳо ва арзишҳо алоҳида нигоҳ дошта мешаванд, ки ба онҳо ишора мекунанд ишораҳо аз коса. Косаҳо метавонанд фазои нопурра дошта бошанд.
- Паҳншавии пуррашавӣ: Ҳангоми илова кардани элементҳо, харита метавонад дубора хеш шавад ва шумораи косаҳоро зиёд кунад, ки ин талаб мекунад ёдгирии нав.
- Тартиби ёдгирӣ: Go маълумотҳоро дар ёдгирӣ мувофиқ мекунад, ки метавонад ба байтҳои иловагӣ барои таъмини дастрасии дуруст оварда расонад.
Аз ин рӯ, наметавон шумораи дақиқи байтҳоро номбар кард, зеро он дар асоси мазмун ва рушди харита динамикӣ тағйир меёбад. Мумкин аст ҳадди поёнӣ (ёдгирӣ барои hmap ва аввалин коса) ва ҳадди болоӣ (ҷамъи андозаи калидҳо, арзишҳо, косаҳо ва маълумоти ёрирасон) тахмин зада шавад, аммо андозаи дақиқи он аз runtime-и Go вобаста аст.
Барои тахмини андоза, метавон аз бастаи unsafe ё воситаҳои хатоҷӯӣ истифода кард, аммо онҳо андозаро дар як лаҳзаи муайян барои мазмуни муайян медиҳанд.
// Мисоли сохтори `hmap` (оддӣ кардашуда)
// Сохтор барои истифодаи мустақим пешбинӣ нашудааст
// ва майдонҳои он метавонанд дар версияҳои гуногуни Go тағйир ёбанд.
type hmap struct {
// Эзоҳ: формати `hmap` дар ../runtime/map.go тавсиф шудааст.
// Ин як ҷадвали ҳеш бо косаҳо аст, ки аз heap-и Go ҷудо шудааст.
// hmap.buckets ишора мекунад ба срези косаҳо (мумкин аст nil бошад).
// Ҳар коса массиви `hmap.B` бо андозаи B аст.
// Ҷойгиршавӣ дар коса калид ва арзишро барои як вуруди харита нигоҳ медорад,
// илова бар он, байти tophash. Калидҳо ва арзишҳо дар ҳамон
// вуруди коса нигоҳ дошта мешаванд, ки арзишҳо пас аз калидҳо меоянд.
// Агар андозаи калидҳо/арзишҳо калон бошанд, онҳо ба таври индирект дар
// косаҳои overflow навишта мешаванд, ки аз нишондиҳандаҳои overflow дар косаҳои асосӣ оғоз мешаванд.
count int // шумораи ҳуҷраҳои зинда; на 0, агар дар харита вурудҳо бошанд
flags uint8
B uint8 // лог_2-и шумораи косаҳо (мумкин аст то 2^B вуруд нигоҳ дорад)
noverflow uint16 // шумораи тахминӣ аз косаҳои overflow
hash0 uint32 // тухмии хеш
buckets unsafe.Pointer // массиви 2^B косаҳо, дар heap ҷойгир шудааст
oldbuckets unsafe.Pointer // массиви қаблӣ аз 2^B косаҳо, дар heap ҷойгир шудааст
nevacuate uintptr // ҳисобкунаки пешрафт барои эвакуация (гузаронидани косаҳо ба нав)
// рост аст, вақте ки навъҳои калид ё арзиш дорои ишораҳо ҳастанд, ки бояд скан шаванд
keysize uint8 // андозаи навъи калид
valuesize uint8 // андозаи навъи арзиш
elemsize uint16 // андозаи калид + арзиш (барои нигоҳдории дар ҷой)
// ишора ба срези косаҳои overflow, дар heap ҷойгир шудааст
overflow *[]*bmap
}
// Мисоли сохтори `bmap` (оддӣ кардашуда)
// Навъи коса.
type bmap struct {
// Тарҳрезии коса мураккаб аст.
// Тавсифи бештар дар src/runtime/hashmap.go.
tophash [8]uint8 // 8 байт tophash (як барои ҳар пар kv)
// пас аз калидҳо ва баъдан арзишҳо
// пас аз ишора ба overflow
}