Rumah > pembangunan bahagian belakang > Golang > Mengapakah Penggunaan Memori Go untuk Rentetan Pendek dan Panjang Kelihatan Sama?

Mengapakah Penggunaan Memori Go untuk Rentetan Pendek dan Panjang Kelihatan Sama?

Barbara Streisand
Lepaskan: 2024-12-30 01:03:24
asal
870 orang telah melayarinya

Why Does Go's Memory Usage for Short and Long Strings Appear Identical?

Penggunaan Memori Rentetan dalam Golang

Pengoptimuman kod selalunya melibatkan mempertimbangkan penggunaan memori. Mari kita periksa contoh rentetan [rentetan] peta dengan nilai sama ada "A" atau "B." Nampaknya logik untuk menggunakan map[string]bool sebagai gantinya, kerana ia memerlukan lebih sedikit memori.

Walau bagaimanapun, ujian mendedahkan hasil yang mengejutkan. Penggunaan memori rentetan dengan satu aksara ("a") dan rentetan dengan urutan aksara yang sangat panjang ("a2") adalah sama.

Untuk memahami gelagat ini, kita perlu mempertimbangkan cara Go mengendalikan memori untuk rentetan dan peta.

Memahami Memori Go Pengendalian

  • Peta: Dalam Go, peta dilaksanakan menggunakan penunjuk. Oleh itu, tidak selamat.Sizeof(somemap) akan melaporkan saiz penuding pada peta, bukan saiz data sebenar yang terkandung di dalamnya.
  • String: Strings in Go diwakili oleh struct yang mengandungi penunjuk kepada data dan panjangnya. Oleh itu, unsafe.Sizeof(somestring) melaporkan saiz struct ini, yang tidak bergantung pada panjang rentetan.

Mengira Penggunaan Memori Sebenar

Untuk menentukan keperluan memori sebenar peta atau rentetan, kita perlu mempertimbangkan data itu tahan.

  • Peta: Untuk peta, keperluan memori bukan sahaja saiz penuding tetapi juga memori yang diperuntukkan untuk pasangan nilai kunci. Untuk mendapatkan saiz dalam ini, anda boleh merujuk kepada sumber lain seperti [soalan StackOverflow ini](https://stackoverflow.com/questions/33159892/how-much-memory-do-golang-maps-reserve).
  • String: Go menyimpan nilai rentetan dalam ingatan sebagai urutan bait yang dikodkan UTF-8. Keperluan memori ialah panjang rentetan ditambah saiz struct pengepala:
stringSize := len(str) + int(unsafe.Sizeof(str))
Salin selepas log masuk

Pertimbangan Tambahan

  • String Menghiris: Apabila anda menghiris rentetan, tatasusunan sandaran untuk rentetan asal masih akan dikekalkan dalam ingatan, walaupun ia tidak lagi dirujuk. Ini boleh memberi kesan kepada penggunaan memori hirisan rentetan yang lebih kecil.

Ringkasnya, walaupun tidak selamat.Sizeof() boleh memberikan cerapan tentang penggunaan memori, ia tidak memberikan gambaran yang lengkap. Untuk pengiraan memori yang tepat, pertimbangkan struktur data sebenar dan kandungannya.

Atas ialah kandungan terperinci Mengapakah Penggunaan Memori Go untuk Rentetan Pendek dan Panjang Kelihatan Sama?. 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