Rumah >pembangunan bahagian belakang >Golang >Mengapa Panjang Rentetan Nampaknya Tiada Kesan terhadap Penggunaan Memori dalam `map[rentetan]rentetan` Go?
Apabila mengoptimumkan kod menggunakan rentetan[rentetan] peta dengan hanya dua kemungkinan nilai ("A" atau "B"), mengurangkannya kepada map[string]bool kelihatan seperti peningkatan yang jelas untuk prestasi. Walau bagaimanapun, ujian mendedahkan pemerhatian yang mengejutkan: penggunaan memori rentetan panjang ("a2") tidak berbeza daripada rentetan aksara tunggal ("a").
Untuk memahami tingkah laku ini, adalah penting untuk ambil perhatian bahawa tidak selamat.Sizeof() tidak mengambil kira saiz struktur data yang dirujuk. Sebaliknya, ia hanya melaporkan saiz "cetek" nilai yang diluluskan.
Dalam Go, peta ialah penunjuk kepada struktur data. Memanggil tidak selamat.Sizeof(somemap) mengembalikan saiz penunjuk ini, bukan memori sebenar yang digunakan oleh elemen dalam peta.
Begitu juga, rentetan dalam Go diwakili oleh pengepala yang mengandungi penunjuk dan panjang. Memanggil tidak selamat.Sizeof(somestring) akan mengembalikan saiz pengepala ini, yang tidak bergantung pada panjang rentetan.
Memori sebenar yang diperlukan untuk menyimpan nilai rentetan dalam ingatan adalah sama dengan panjang jujukan bait yang dikodkan UTF-8 ditambah saiz pengepalanya. Untuk mengira ini, anda boleh menggunakan formula berikut:
stringSize = len(str) + int(unsafe.Sizeof(str))
Ia juga penting untuk diingat bahawa penghirisan rentetan mencipta pengepala baharu yang menghala ke tatasusunan belakang rentetan asal. Ini bermakna walaupun rentetan yang dihiris (s2) adalah kecil, keseluruhan tatasusunan sandaran rentetan (s) asal masih akan dikekalkan dalam ingatan.
Atas ialah kandungan terperinci Mengapa Panjang Rentetan Nampaknya Tiada Kesan terhadap Penggunaan Memori dalam `map[rentetan]rentetan` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!