使用只有两个可能值(“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中文网其他相关文章!