首页 >后端开发 >Golang >为什么 Go 的'map[string]string”中字符串长度似乎对内存使用没有影响?

为什么 Go 的'map[string]string”中字符串长度似乎对内存使用没有影响?

Susan Sarandon
Susan Sarandon原创
2024-12-26 12:24:11536浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn