Rumah >pembangunan bahagian belakang >Golang >Mengapakah `map[string]string` dan `map[string]bool` Menunjukkan Penggunaan Memori Serupa dalam Go?

Mengapakah `map[string]string` dan `map[string]bool` Menunjukkan Penggunaan Memori Serupa dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-18 02:17:11440semak imbas

Why Does `map[string]string` and `map[string]bool` Show Similar Memory Usage in Go?

Penggunaan Memori Rentetan dalam Golang

Apabila mengoptimumkan kod menggunakan rentetan[rentetan] peta dengan nilai hanya menjadi "A" atau "B ", andaian mungkin bahawa map[string]bool akan lebih cekap kerana jenis nilainya yang lebih kecil. Walau bagaimanapun, ujian mendedahkan bahawa penggunaan memori untuk kedua-dua peta adalah sama.

Memahami tidak selamat.Sizeof()

Untuk menyiasat perkara ini, tidak selamat.Sizeof() ialah digunakan untuk mengukur penggunaan memori. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa unsafe.Sizeof() hanya melaporkan saiz "cetek" data. Dalam kes peta, Go melaksanakannya menggunakan penunjuk. Oleh itu, tidak selamat.Sizeof(somemap) melaporkan saiz penuding, bukan keseluruhan data peta.

Perwakilan Memori Rentetan

String dalam Go diwakili oleh pengepala terdiri daripada penunjuk kepada data dan panjang. Jenis reflect.StringHeader mentakrifkan struktur ini:

type StringHeader struct {
    Data uintptr
    Len  int
}

Oleh itu, tidak selamat.Sizeof(somemap) hanya akan melaporkan saiz pengepala ini, yang bebas daripada nilai rentetan.

Keperluan Memori Sebenar untuk Peta

Untuk mendapatkan penggunaan memori sebenar untuk peta, adalah penting untuk mempertimbangkan data yang mereka rujuk. Dalam erti kata lain, len(str) int(unsafe.Sizeof(str)) memberikan anggaran yang lebih tepat.

Pertimbangan Tambahan

String dalam Go store UTF-8 urutan bait dalam ingatan. Fungsi len() melaporkan panjang bait, jadi penggunaan memori sebenar untuk rentetan boleh dianggarkan dengan:

stringSize := len(str) + int(unsafe.Sizeof(str))

Ia juga penting untuk diingat bahawa menghiris rentetan sedia ada memperuntukkan tatasusunan sandaran baharu untuk hirisan . Walaupun rentetan asal tidak lagi dirujuk, tatasusunan sandaran akan kekal dalam ingatan untuk menyokong hirisan.

Atas ialah kandungan terperinci Mengapakah `map[string]string` dan `map[string]bool` Menunjukkan Penggunaan Memori Serupa dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn