使用只有兩個可能值(「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中文網其他相關文章!