关于go:Golang中的字符串内存使用情况

您所在的位置:网站首页 go语言内存占用 关于go:Golang中的字符串内存使用情况

关于go:Golang中的字符串内存使用情况

2024-05-19 10:22| 来源: 网络整理| 查看: 265

我正在使用map [string] string优化代码,其中map的值仅为" A"或" B"。 因此,我认为显然,map [string] bool更好,因为该地图可容纳约5000万个元素。

1234567891011121314151617181920212223var a ="a" var a2 ="Why This ultra long string take the same amount of space in memory as 'a'" var b = true var c map[string]string var d map[string]bool c["t"] ="A" d["t"] = true fmt.Printf("a: %T, %d\ ", a, unsafe.Sizeof(a)) fmt.Printf("a2: %T, %d\ ", a2, unsafe.Sizeof(a2)) fmt.Printf("b: %T, %d\ ", b, unsafe.Sizeof(b)) fmt.Printf("c: %T, %d\ ", c, unsafe.Sizeof(c)) fmt.Printf("d: %T, %d\ ", d, unsafe.Sizeof(d)) fmt.Printf("c: %T, %d\ ", c, unsafe.Sizeof(c["t"])) fmt.Printf("d: %T, %d\ ", d, unsafe.Sizeof(d["t"]))

结果是:

1234567a: string, 8 a2: string, 8 b: bool, 1 c: map[string]string, 4 d: map[string]bool, 4 c2: map[string]string, 8 d2: map[string]bool, 1

在测试时,我发现有些奇怪,为什么带有很长字符串的a2使用8个字节,就像一个只有一个字母一样?

相关讨论 使用Gos Profiler优化程序。 一般和有用的规则:务必仔细阅读每个功能和每个软件包的正式文档。 答案就在那里。

unsafe.Sizeof()不会递归地进入数据结构,它只是报告所传递值的"浅"大小。引用其文档:

The size does not include any memory possibly referenced by x. For instance, if x is a slice, Sizeof returns the size of the slice descriptor, not the size of the memory referenced by the slice.

Go中的地图被实现为指针,因此unsafe.Sizeof(somemap)将报告该指针的大小。

Go中的字符串只是包含指针和长度的标头。参见reflect.StringHeader:

1234type StringHeader struct {         Data uintptr         Len  int }

因此,unsafe.Sizeof(somestring)将报告上述结构的大小,而与string值(即Len字段的值)的长度无关。

要获取映射的实际内存需求("深度"),请参阅golang映射保留多少内存?还有如何在Go中获取变量的内存大小?

Go将UTF-8编码的string值的字节序列存储在内存中。内置函数len()报告string的字节长度,因此 基本上,在内存中存储string值所需的内存为:

123var str string ="some string" stringSize := len(str) + unsafe.Sizeof(str)

同样不要忘记,可以通过切片另一个更大的字符串来构造string值,因此,即使不再引用原始字符串(因此不再需要),也仍然需要使用更大的支持数组保留在内存中用于较小的字符串切片。

例如:

12s :="some loooooooong string" s2 := s[:2]

在这里,即使s2的内存要求为len(s2) + unsafe.Sizeof(str) = 2 + unsafe.Sizeof(str),仍然会保留s的整个后备数组。

相关讨论 谢谢您的回复! 因此,基本上遵循StringHeader结构,内存中字符串的大小等于sizeof(uintptr)* Len? @Dylan否,StringHeader.Data是一个指针,字符串的字节(字符)存储在内存中。 string值的大小基本上是其长度(字节长度)加上标题的大小。 参见编辑后的答案。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3