Middle+
Kiek baitų užima žemėlapis (map) Golang?
sobes.tech AI
Atsakymas iš AI
Golang-də map-ın ölçüsü sabit deyil və çox amillərə bağlıdır:
- Elementlərin sayı: Elementlərin sayı çox olduqda, onları saxlamaq üçün daha çox yaddaş tələb olunur.
- Açarlar və dəyərlərin ölçüsü: Hər bir açar və dəyər yaddaş tutar. Sətirlər, slayslər, strukturlar — bunlar ümumi ölçüyə təsir edir.
hmapstrukturunun xidməti məlumatları: map — buhmapstrukturuna istinad edir. Bu strukturda xidməti sahələr var:- elementlərin sayı
- səbətlərə (buckets) göstəricilər
- köçürmələr (böyümə/kiçiltmə) sayı
- digər metadatalar
- Səbətlərin ölçüsü (buckets): Elementlər səbətlərdə saxlanılır. Hər səbət sabit ölçüyə malikdir (adətən 8 açar-dəyər cütü), lakin açar və dəyərlərin məlumatları ayrıca saxlanılır, səbətdəki göstəricilər vasitəsilə göstərilir. Səbətlərdə istifadə olunmayan yer ola bilər.
- Doldurma sıxlığı: Elementlər əlavə etdikdə map yenidən hash-lənə bilər və səbətlərin sayı artar, bu da yeni yaddaş ayırmağı tələb edir.
- Yaddaşın hizalanması: Go məlumatları yaddaşda hizalayır, bu da əlavə baytlar tələb edə bilər düzgün erişim üçün.
Beləliklə, dəqiq bayt sayını adlandırmaq mümkün deyil, çünki o, məzmun və map-ın böyüməsinə görə dinamik dəyişir. Aşağı həddi (hmap və ilk səbət üçün) və yuxarı həddi (açarlar, dəyərlər, səbətlər və xidməti məlumatların cəmisi) qiymətləndirmək olar, lakin dəqiq ölçü Go-nun runtime-ına bağlıdır.
Ölçünü qiymətləndirmək üçün unsafe paketindən və ya debug alətlərindən istifadə etmək olar, lakin onlar konkret vaxtda konkret məzmun üçün ölçü verəcək.
// `hmap` strukturunun nümunəsi (sadələşdirilmiş)
// Bu struktur birbaşa istifadə üçün nəzərdə tutulmayıb
// və onun sahələri Go versiyalarına görə dəyişə bilər.
type hmap struct {
// `hmap` formatı ../runtime/map.go faylında təsvir olunub.
// Bu, go heap-dən ayrılmış xəritə cədvəlidir.
// hmap.buckets göstəricisi səbət massivinə işarə edir (nil ola bilər).
// Hər səbət `hmap.B` elementlərindən ibarətdir, burada B səbətin ölçüsüdür.
// Səbətdəki hər bir element bir xəritə girişinin açarı və dəyərini saxlayır,
// plus tophash baytı. Açarlar və dəyərlər eyni səbət girişində saxlanılır,
// dəyərlər açarların ardınca yerləşir.
// Əgər açar/dəyər ölçüləri böyükdürsə, onlar dolayısı ilə overflow səbətlərinə yazılır,
// overflow göstəriciləri vasitəsilə əsas səbətlərdən başlayır.
count int // canlı hüceyrələrin sayı; xəritədə hər hansı giriş varsa, 0-dan fərqli
flags uint8
B uint8 // səbət sayıların logaritmi (2^B-ə qədər yerləşdirə bilər)
noverflow uint16 // təxmini overflow səbət sayı
hash0 uint32 // hash toxumu
buckets unsafe.Pointer // 2^B səbət massivləri, heap-də ayrılıb
oldbuckets unsafe.Pointer // əvvəlki səbət massivləri, heap-də ayrılıb
nevacuate uintptr // evakuasiya üçün irəliləyiş göstəricisi (səbət köçürülür)
// açar və ya dəyər tipində göstəricilər, skan etməyi tələb edir
keysize uint8 // açar tipinin ölçüsü
valuesize uint8 // dəyər tipinin ölçüsü
elemsize uint16 // açar + dəyər ölçüsü (yerində saxlama üçün)
// overflow səbət göstəricisi, heap-də ayrılıb
overflow *[]*bmap
}
// `bmap` strukturunun nümunəsi (sadələşdirilmiş)
// Səbət tipi.
type bmap struct {
// Səbətin quruluşu mürəkkəbdir.
// Ətraflı məlumat üçün src/runtime/hashmap.go baxın.
tophash [8]uint8 // 8 tophash baytı (hər kv cütü üçün bir)
// ardınca açarlar və sonra dəyərlər
// overflow göstəricisi
}