Sobes.tech
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.
  • hmap struktūras pakalpojuma dati: map — tas ir atsauce uz hmap struktū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
}