首頁 > 後端開發 > Golang > 為什麼 Go 的'map[string]string”中字串長度似乎對記憶體使用沒有影響?

為什麼 Go 的'map[string]string”中字串長度似乎對記憶體使用沒有影響?

Susan Sarandon
發布: 2024-12-26 12:24:11
原創
549 人瀏覽過

Why Does String Length Seem to Have No Impact on Memory Usage in Go's `map[string]string`?

Golang 中的字串記憶體使用

使用只有兩個可能值(「A」或「B」)的map[string]string 最佳化程式碼時,減少它到map[string]bool 似乎對性能有明顯的改進。然而,測試揭示了一個令人驚訝的觀察結果:長字串(“a2”)的記憶體佔用與單字元字串(“a”)沒有什麼不同。

說明

理解對於這種行為,需要注意的是 unsafe.Sizeof() 不考慮引用的資料結構的大小。相反,它只報告傳遞值的“淺”大小。

在 Go 中,映射是指向資料結構的指標。呼叫 unsafe.Sizeof(somemap) 傳回該指標的大小,而不是映射中元素實際使用的記憶體。

類似地,Go 中的字串由包含指標和長度的標頭表示。呼叫 unsafe.Sizeof(somestring) 將傳回此標頭的大小,該大小與字串的長度無關。

字串的記憶體需求

在記憶體中儲存字串值所需的實際記憶體等於其 UTF-8 編碼位元組序列的長度加上其標頭的大小。要計算此值,您可以使用以下公式:

stringSize = len(str) + int(unsafe.Sizeof(str))
登入後複製

字串切片和記憶體使用

記住字串切片會建立一個指向後備數組的新標頭,這一點也很重要。原始字串。這意味著即使切片字串 (s2) 很小,原始字串 (s) 的整個後備數組仍將保留在記憶體中。

以上是為什麼 Go 的'map[string]string”中字串長度似乎對記憶體使用沒有影響?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板