给定未指定初始space的地图分配,例如:
foo := make(map[string]int)
documentation表明这里的内存分配是依赖于实现的。那么(怎么样)我可以告诉我的实现分配给这张地图的内存量是多少?
答案 0 :(得分:7)
您可以使用Go测试工具来测量任意复杂数据结构的大小。这个答案详细说明:How to get variable memory size of variable in golang?
要衡量make(map[string]int)
创建的地图的大小,请使用以下基准测试功能:
var x map[string]int
func BenchmarkEmptyMap(b *testing.B) {
for i := 0; i < b.N; i++ {
x = make(map[string]int)
}
}
执行
go test -bench . -benchmem
结果是:
BenchmarkEmptyMap-4 20000000 110 ns/op 48 B/op 1 allocs/op
所以答案是我的64位架构: 48字节。
正如所暗示的那样,规模可能取决于架构。另外,尺寸可能取决于您传递给make()
的初始容量,如您在此示例中所示:
func BenchmarkEmptyMapCap100(b *testing.B) {
for i := 0; i < b.N; i++ {
x = make(map[string]int, 100)
}
}
输出:
BenchmarkEmptyMapCap100-4 1000000 1783 ns/op 4176 B/op 3 allocs/op
初始容量为100的map[string]int
类型的地图现在需要4176个字节(在64位拱门上)。
如果未明确指定,默认初始容量约为7.
答案 1 :(得分:5)
如果查看Go的地图类型的source,您会看到地图由标题(类型hmap
)和数组(类型bmap
)组成。创建新映射但未指定初始空间(hint
)时,仅创建一个存储桶。
标题包含几个字段:
1 * int
,
2 * uint8
,
1 * uint16
,
1 * uint32
,
2 * unsafe.Pointer
,
1 * uintptr
。
类型int
,uintptr
和unsafe.Pointer
的大小等于单词的大小(64位计算机上的8个字节)。
一个存储桶由一个8 * uint8
的数组组成。
这总共提供40 + 8 = 48字节(64位架构)