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

只是出于好奇,从源代码中询问

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个字节


但为什么创建成本是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


qq_花开花谢_0
浏览 86回答 1
1回答

慕桂英4014372

为什么创建成本是0?Go 堆栈分配在堆上分配零字节。mp := map[byte]byte{}main map[byte]byte literal does not escapepackage mainimport (    "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
打开App,查看更多内容
随时随地看视频慕课网APP