優化使用值限制為「A」或「B」的map[string]string 的程式碼時,人們可能會假設:由於值較小,map[string]bool 會更有效。然而,經過測試,發現兩張地圖的記憶體使用量保持不變。這種差異值得進一步探索。
在 Go 中,字串不是作為連續位元組儲存在記憶體中,而是作為包含指向實際資料及其長度的指標的標頭。 unsafe.Sizeof() 函數用於確定變數的大小,僅檢索此標頭的大小,無論字串的長度如何,它都保持不變。
類似,Go 的映射實作為指針,這意味著 unsafe.Sizeof() 報告指針的大小而不是映射的內容。因此,map[string]string和map[string]bool報告的記憶體使用情況僅反映了它們各自指標的大小。
計算實際記憶體映射的消耗,需要考慮其底層資料結構的大小,包括鍵值對和任何分配的記憶體。對於字串,它們的記憶體需求可以估計為其位元組長度和標頭大小的總和。但是,需要注意的是,即使字串被切片或修改,底層後備數組仍可能保留在記憶體中。
在 Go 中,unsafe.Sizeof()函數不提供記憶體使用情況的全面表示,特別是對於映射和字串等資料結構。在優化記憶體消耗時,考慮資料結構及其內容的實際記憶體需求至關重要。
以上是為什麼 Go 的 unsafe.Sizeof() 不能反映帶有字串的映射的實際記憶體使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!