在golang中声明一个空的map [string] interface {}的内存成本/开销是多少?

时间:2019-06-08 00:46:52

标签: go data-structures hashtable

source code

type hmap struct {
    count     int // 1 word
    flags     uint8
    B         uint8  
    noverflow uint16 
    hash0     uint32 // = 8 byte

    buckets    unsafe.Pointer // 1 word
    oldbuckets unsafe.Pointer // 1 word
    nevacuate  uintptr        // 1 word

    extra *mapextra // 1 word
}

因此至少会:5个字+ 8个字节

但是为什么creation cost is 0呢? -


package main

import (
    "fmt"
    "runtime"
)

func main() {
    var m1, m2 runtime.MemStats
    var i byte

    runtime.ReadMemStats(&m1)
    mp := map[byte]byte{}
    runtime.ReadMemStats(&m2)
    fmt.Println("Bytes allocated on creation:", m2.Alloc-m1.Alloc)
    for i = 0; i < 100; i++ {
        runtime.ReadMemStats(&m1)
        mp[i] = i
        runtime.ReadMemStats(&m2)
        fmt.Printf("Bytes allocated on assignment %d: %d\n", i, m2.Alloc-m1.Alloc)
    }
}

游乐场:https://play.golang.org/p/iyYshDzexQt

输出:

Bytes allocated on creation: 0

1 个答案:

答案 0 :(得分:3)

  

为什么使用creation cost is 0

Go堆栈分配在堆上分配零字节。

mp := map[byte]byte{}

main map[byte]byte literal does not escape

package main

import (
    "fmt"
    "runtime"
)

func main() {
    var m1, m2 runtime.MemStats
    var i byte

    runtime.ReadMemStats(&m1)
    mp := map[byte]byte{}
    runtime.ReadMemStats(&m2)
    fmt.Println("Bytes allocated on creation:", m2.Alloc-m1.Alloc)
    for i = 0; i < 100; i++ {
        runtime.ReadMemStats(&m1)
        mp[i] = i
        runtime.ReadMemStats(&m2)
        fmt.Printf("Bytes allocated on assignment %d: %d\n", i, m2.Alloc-m1.Alloc)
    }
}

游乐场:https://play.golang.org/p/iyYshDzexQt

输出:

Bytes allocated on creation: 0