GoのメモリにおけるHeapの確認 (1)
コード
- 単純にポインタを返すからheapかと言われると
- インライン展開で最適化されてそうじゃなくなるケースがあるようだ
package main func makeHeap() *[]int { v := []int{} return &v } func main() { for i := 0; i < 1000; i++ { _ = makeHeap() } }
インライン展開無しでheapを確認する
-l
を使用するとインライン展開を無しに出来る- vはheapへ行く
go run -gcflags '-m -l' main.go # command-line-arguments ./main.go:5:9: &v escapes to heap ./main.go:4:2: moved to heap: v ./main.go:4:12: []int literal escapes to heap
この状態でtraceすると、heapにデータがのっていることがわかる
インライン展開つきでheapを確認する
-l
を取り除くとインライン展開される
go run -gcflags '-m' main.go # command-line-arguments ./main.go:3:6: can inline makeHeap ./main.go:10:15: inlining call to makeHeap ./main.go:5:9: &v escapes to heap ./main.go:4:2: moved to heap: v ./main.go:4:12: []int literal escapes to heap ./main.go:10:15: main []int literal does not escape ./main.go:10:15: main &v does not escape
この状態でtraceをするとheapが使われていないことが分かる
コンパイルオプションについて
- https://github.com/golang/go/wiki/CompilerOptimizations
- https://qiita.com/ryskiwt/items/574a07c6235735afa5d7
- https://golang.org/cmd/compile/#hdr-Command_Line
- こちらのURLに詳しい