【发布时间】:2018-09-21 00:14:59
【问题描述】:
我在the runtime 中找不到它,但我想知道在重新分配映射或切片时,go 如何决定可能需要多少内存。所以当我们看这个时(同样适用于切片):
test := map[int]string{}
for i := 0; i < 1000; i++ {
test[i] = fmt.Sprintf("test-%d", i)
}
一开始会分配多少内存,在循环期间会发生多少次重新分配?
我问这个是因为我想弄清楚是否存在应用自定义重新分配策略有意义的情况(即使用数组而不是切片,并在需要时按可能符合我的因素增长数组应用程序的要求)。
【问题讨论】:
-
你可以用
make(map[int]string, 1000)为1000个元素“预分配”一个大容量的地图,所以不会发生重新分配。 -
是的,没错,但如果我不能呢?可能有些情况我无法预测总长度,但我可能知道当它超过容量时它会增长到哪些维度。
-
即使你弄清楚它在你的配置中是如何工作的,最好不要依赖这样的内部结构,因为它可能会根据所使用的编译器、版本、操作系统和架构而有所不同。要了解如何“测量”它,这可能很有用:How much memory do golang maps reserve?
-
这是一个实现细节,因此平台、编译器和版本之间可能/确实会有所不同。
-
appendandruntime.growslice— 对 1.8 仍然有效;没有检查更高版本。
标签: go memory-management