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
Lepaskan: 2024-12-18 02:17:11
asal
438 orang telah melayarinya

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
}
Salin selepas log masuk

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))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan