duanhongxian6982 2019-06-08 00:46
浏览 191
已采纳

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

This question already has an answer here:

Asking just for curiousity, from the 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
}

so it would at least: 5 word + 8 byte

but why the 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
", i, m2.Alloc-m1.Alloc)
    }
}

Playground: https://play.golang.org/p/iyYshDzexQt

Output:

Bytes allocated on creation: 0
</div>
  • 写回答

1条回答 默认 最新

  • dongliao9018 2019-06-08 02:13
    关注

    why the creation cost is 0?

    A Go stack allocation allocates zero bytes on the heap.

    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
    ", i, m2.Alloc-m1.Alloc)
        }
    }
    

    Playground: https://play.golang.org/p/iyYshDzexQt

    Output:

    Bytes allocated on creation: 0
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体