Sobes.tech
Middle+

Golang'da bir harita (map) kaç bayt tutar?

sobes.tech yapay zeka

AI'dan gelen yanıt

Golang'da map'in boyutu sabit değildir ve birçok faktöre bağlıdır:

  • Eleman sayısı: Ne kadar çok eleman varsa, depolama için o kadar fazla bellek gerekir.
  • Anahtarlar ve değerlerin boyutu: Her anahtar ve değer bellek kullanır. Stringler, dilimler, yapılar – bunların hepsi toplam boyutu etkiler.
  • hmap yapısının hizmet verileri: bir map, hmap yapısına işaret eden bir göstericidir. Bu yapı, hizmet alanlarını içerir:
    • eleman sayacı
    • buckets (kova) göstericileri
    • göç (büyüme/küçülme) sayacı
    • ve diğer meta veriler
  • Kovaların boyutu: Elemanlar kovalar içinde saklanır. Her kova sabit bir boyuta sahiptir (genellikle 8 anahtar-değer çifti), ancak anahtarlar ve değerler ayrı ayrı saklanır ve kovadaki göstericilerle işaretlenir. Kovalar, kullanılmayan alan içerebilir.
  • Doldurma yoğunluğu: Elemanlar eklenirken, map yeniden hashlenebilir ve kova sayısı artırılabilir, bu da yeni bellek tahsisini gerektirir.
  • Bellek hizalaması: Go, verileri bellekte hizalar, bu da doğru erişimi sağlamak için ek baytlar ekleyebilir.

Bu nedenle, toplam bayt sayısını kesin olarak belirlemek mümkün değildir çünkü içerik ve map'in büyümesine bağlı olarak dinamik olarak değişir. Alt sınır (hmap ve ilk kova için bellek) ve üst sınır (anahtarların, değerlerin, kovaların ve meta verilerin toplam boyutu) tahmin edilebilir, ancak kesin boyut, Go'nun çalışma zamanına bağlıdır.

Boyutu tahmin etmek için unsafe paketi veya hata ayıklama araçları kullanılabilir, ancak bunlar belirli bir anda belirli bir içerik için boyutu verir.

// Basitleştirilmiş `hmap` yapısı örneği
// Bu yapı doğrudan kullanım için tasarlanmamıştır
// ve alanları Go sürümlerine göre değişebilir.
type hmap struct {
	// `hmap` formatı ../runtime/map.go'da tanımlanmıştır.
	// Bu, Go yığını üzerinde tahsis edilen kovbalı bir hash tablosudur.
	// hmap.buckets, kovaların dilimini gösterir (nil olabilir).
	// Her kova, hmap.B girişlerinin bir dizisidir, burada B kova boyutudur.
	// Bir kova girişi, tek bir map girdisi için anahtar ve değeri saklar,
	// ayrıca bir tophash baytı içerir. Anahtarlar ve değerler aynı
	// kova girişinde saklanır, değerler anahtarların ardından gelir.
	// Anahtar/değer boyutları büyükse, dolgu kovalarına dolaylı olarak yazılır,
	// ana kova içindeki overflow göstergeleriyle başlarlar.

	count     int // canlı hücre sayısı; 0'dan farklıysa, map'te girişler vardır
	flags     uint8
	B         uint8  // kovaların log_2 değeri (en fazla 2^B giriş tutabilir)
	noverflow uint16 // yaklaşık overflow kovası sayısı
	hash0     uint32 // hash tohum

	buckets    unsafe.Pointer // 2^B kovaların dizisi, heap üzerinde tahsis edilmiştir
	oldbuckets unsafe.Pointer // önceki 2^B kovaların dizisi, heap üzerinde tahsis edilmiştir

	nevacuate uintptr // tahliye ilerleme sayacı (kovalar yeni yere taşındı)

	// anahtar veya değer türünde işaretçiler varsa, tarama gerektirir
	keysize  uint8 // anahtar türünün boyutu
	valuesize uint8 // değer türünün boyutu
	elemsize  uint16 // anahtar + değer boyutu (yerinde depolama için)

	// overflow kovalarının dilimine işaretçi, heap üzerinde tahsis edilmiştir
	overflow *[]*bmap
}

// Basitleştirilmiş bmap yapısı örneği
// Kova tipi.
type bmap struct {
	// Bir kovaların düzeni karmaşıktır.
	// Detaylar için src/runtime/hashmap.go'ya bakın.
	tophash [8]uint8 // 8 tophash baytı (her anahtar-değer çifti için)
	// anahtarlar ve ardından değerler
	// overflow göstergesi ile takip edilir
}