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!