golang地图预留了多少内存?

时间:2017-09-18 11:17:33

标签: dictionary go heap-memory

给定未指定初始space的地图分配,例如:

foo := make(map[string]int)

documentation表明这里的内存分配是依赖于实现的。那么(怎么样)我可以告诉我的实现分配给这张地图的内存量是多少?

2 个答案:

答案 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

类型intuintptrunsafe.Pointer的大小等于单词的大小(64位计算机上的8个字节)。

一个存储桶由一个8 * uint8的数组组成。

这总共提供40 + 8 = 48字节(64位架构)