KDOC 414: インターフェースがヒープにエスケープされるのを見る
この文書のステータス
- 作成
- 2025-07-01 貴島
- レビュー
- 2025-07-19 貴島
概要
関数を抜けた後も使うようなケースでは、消されないようにスタックからヒープに移す必要がある。インターフェースを返すと、実体を関数から抜けた後も保持しておく必要があるため、ヒープにエスケープされる。
tmpfile=$(mktemp /tmp/tmpgo.XXXXXX.go)
cat > $tmpfile <<EOF
package main
func main() {}
func f() any {
x := "hello"
return x // ヒープへ
}
EOF
go build -gcflags="-m" -o bin $tmpfile 2>&1
rm bin
rm $tmpfile
/tmp/tmpgo.wTCwGe.go:3:6: can inline main
/tmp/tmpgo.wTCwGe.go:5:6: can inline f
/tmp/tmpgo.wTCwGe.go:7:10: x escapes to heap
関連
抽象。
- 値を型を隠した入れ物に包んで返すと、中身が関数の外まで生きるので、関数ごとに捨てる領域に置けなくなる
関連。
- 動機: KDOC 411: スタックは積み重ねて取り出して解放する。ではヒープは?。ヒープを調べるきっかけになった
- 類似: KDOC 413: ローカル変数がヒープにエスケープされるのを見る。関数を抜けた後も使われるものがヒープに移される、別の具体例