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