【Go】エスケープ解析
#Go
初級者の場合は気にしなくていい概念だが、性能を気にする立場なら知っておくべき仕様。
基本的にローカル変数ってのはスコープから外れたら、誰からも参照されずに消えていく。
スタック領域に確保されたまま、そのまま死んでいく。
でも、その変数のポインタをスコープ外に渡す動きをした時には話が変わる。
この時、スタック領域に合ったデータをヒープ領域にコピーした上で、そのポインタをスコープ外に渡す挙動が起きる。
これがエスケープ解析。
ヒープ領域に行って、そこに対する参照が残り続ける限り、そのデータは残る。
code: sample.go
func f() int {
x := 42
return x // スタックでOK(値のコピー)
}
func f() *int {
x := 42
return &x // ヒープへエスケープ(ポインタ返す)
}