Middle+
Cik baitus aizņem karte (map) Golang?
sobes.tech AI
Atbilde no AI
Golang-ā map izmērs nav fiksēts un ir atkarīgs no daudziem faktoriem:
- Elementu skaits: Jo vairāk elementu, jo vairāk atmiņas nepieciešams to glabāšanai.
- Aizslēgu un vērtību izmērs: Katrs aizslēgs un katra vērtība aizņem atmiņu. Virknes, slyde, struktūras — tas viss ietekmē kopējo izmēru.
hmapstruktūras pakalpojuma dati: map — tas ir atsauce uzhmapstruktūru. Šī struktūra satur pakalpojuma laukus:- elementu skaits
- groziem (buckets) norādes
- migrāciju (augšana/samazināšana) skaits
- citas metadatas
- Grozu izmērs (buckets): Elementi tiek glabāti grozos. Katrs grozs ir fiksēta izmēra (parasti 8 pāri atslēga-vērtība), bet atslēgas un vērtības dati tiek glabāti atsevišķi, uz kuriem norāda groza norādītāji. Grozi var saturēt neizmantoto telpu.
- Aizpildes blīvums: Pievienojot elementus, map var pārhashēties un palielināt grozu skaitu, kas prasa jaunas atmiņas piešķiršanu.
- Atmiņas izlīdzināšana: Go izlīdzina datus atmiņā, kas var novest pie papildu baitiem, lai nodrošinātu pareizu piekļuvi.
Tādējādi nav iespējams nosaukt precīzu baitu skaitu, jo tas dinamiski mainās atkarībā no satura un map paplašināšanās. Var novērtēt zemāko robežu (atmiņu hmap un pirmā groza) un augstāko robežu (kļūdas, vērtības, grozi un pakalpojuma dati), bet precīzu izmēru nosaka Go laika izpildlaiks.
Lai novērtētu izmēru, var izmantot unsafe paketi vai atkļūdošanas rīkus, bet tie sniegs izmēru konkrētā brīdī konkrētam saturam.
// `hmap` struktūras piemērs (vienkāršots)
// Struktūra nav paredzēta tiešai lietošanai
// un tās lauki var mainīties starp Go versijām.
type hmap struct {
// `hmap` formāts ir aprakstīts ../runtime/map.go.
// Tas ir haštabla ar groziem, kas ir piešķirti no Go heap.
// hmap.buckets norāda uz grozu masīvu (var būt nil).
// Katrs grozs ir `hmap.B` elementu masīvs, kur B ir groza izmērs.
// Groza ieraksts glabā atslēgu un vērtību vienai map entry,
// plus tophash baitu. Atslēgas un vērtības ir glabātas tajā pašā
// groza ierakstā, ar vērtībām sekojoši pēc atslēgām.
// Ja atslēgas/vērtības ir lielas, tās tiek rakstītas netieši uz overflow groziem,
// sākot ar overflow norādītājiem galvenajos grozos.
count int // dzīvu šūnu skaits; ja map ir ar ierakstiem, tas nav 0
flags uint8
B uint8 // grozu skaita logaritms (var saturēt līdz 2^B ierakstiem)
noverflow uint16 // aptuvenais overflow grozu skaits
hash0 uint32 // haša sēklas
buckets unsafe.Pointer // 2^B grozu masīvs, piešķirts uz heap
oldbuckets unsafe.Pointer // iepriekšējais grozu masīvs, piešķirts uz heap
nevacuate uintptr // evakuācijas progresu skaitītājs (grozi pārvietoti uz jauno)
// patiesi, ja atslēgas vai vērtības tipam ir norādītāji, kas jāskan
keysize uint8 // atslēgas tipa izmērs
valuesize uint8 // vērtības tipa izmērs
elemsize uint16 // atslēgas + vērtības izmērs (vietējai glabāšanai)
// overflow grozu norādītājs, piešķirts uz heap
overflow *[]*bmap
}
// `bmap` struktūras piemērs (vienkāršots)
// Groza tips.
type bmap struct {
// Groza uzbūve ir sarežģīta.
// Detalizētāk skatiet src/runtime/hashmap.go.
tophash [8]uint8 // 8 tophash baiti (viena katram kv pāri)
// seko atslēgas un tad vērtības
// seko overflow norādītājs
}