雑なメモ書き

気楽にいきます

GoのメモリにおけるHeapの確認 (2)

  • appendでsliceのサイズをいじった場合にどうなるかをみた
  • heapへのescapeはあくまで関数間でデータの受け渡しを参照で行った場合に起きるようだ

sliceへappendしてポインタを返した場合

package main

func makeHeap() *[]int {
    v := []int{}
    for i := 0; i < 1000; i++ {
        v = append(v, i)
    }
    return &v
}

func main() {
    _ = makeHeap()
}

これは、heapに乗る

go run -gcflags '-m -l' main.go
# command-line-arguments
./main.go:8:9: &v escapes to heap
./main.go:4:2: moved to heap: v
./main.go:4:12: []int literal escapes to heap

インライン展開をした場合もheapに乗る

go run -gcflags '-m' main.go
# command-line-arguments
./main.go:11:6: can inline main
./main.go:8:9: &v escapes to heap
./main.go:4:2: moved to heap: v
./main.go:4:12: []int literal escapes to heap

単純にsliceへappendした場合

package main

func makeHeap() {
    v := []int{}
    for i := 0; i < 1000; i++ {
        v = append(v, i)
    }
}

func main() {
    makeHeap()
}

関数内部で完結している場合はheapに乗らない

go run -gcflags '-m -l' main.go
# command-line-arguments
./main.go:4:12: makeHeap []int literal does not escape

インライン展開をしても当然一緒

go run -gcflags '-m' main.go
# command-line-arguments
./main.go:10:6: can inline main
./main.go:4:12: makeHeap []int literal does not escape