Golang が変数を処理する方法と、このエスケープ分析が何であるかを理解しましょう。 Golang には、Go 実行環境で使用されるスタックとヒープと呼ばれる 2 種類のメモリ割り当てデータ型があります。
スタックは、(in および out) で操作を実行する方が高速です。関数内でアクセスされる関数内の変数は、このスタックに移動します。 例:
package main import "fmt" func stackExample() int { a := 10 // Variable `a` is allocated on the stack b := 20 // Variable `b` is allocated on the stack result := a + b // `result` is also allocated on the stack return result // All stack variables are popped off when the function exits } func main() { result := stackExample() // Function call happens, variables are pushed to the stack fmt.Println(result) // Print the result }
これは GoLang でのスタックの仕組みです。次は山盛りです。これは動的メモリであり、要件に基づいてサイズを調整できます。これはヒープ割り当ての簡単な例です。
package main import "fmt" func heapExample() *int { num := 42 // Variable `num` is created inside the function return &num // Returning the address of `num`, which escapes the function } func main() { ptr := heapExample() // The value pointed to by `ptr` is allocated on the heap fmt.Println(*ptr) // Accessing the heap-allocated variable through the pointer }
ここでは、関数が num へのポインタを返すため、Go ランタイムは num が関数のスコープ外でアクセスされることを検出します。その結果、スタックではなくヒープに num が割り当てられます。
ヒープは、関数またはゴルーチンのスコープを超える変数を保存するために使用されます。変数の値が非常に大きい場合、ヒープに格納されることがあります。
これら 2 つを理解したら、脱出分析に移りましょう。 Go コードを読むだけでは、どの変数がヒープに割り当てられるかを知る方法はありません。これは「脱出分析」で理解できます。エスケープとは、変数がヒープまたはスタックに格納されるかどうかを決定する関数のスコープからエスケープするかどうかを意味します。
次のように go コードの build コマンドを実行します
go build -gcflags '-m -l'
-m - エスケープ分析を表示するフラグ。
-l - スタック トレースを正確に保つためにインライン化を無効にします。
このコードを取得してください:
package main func escapeExample() *int { x := 42 return &x // x escapes because its address is returned } func noEscapeExample() int { y := 100 return y // y does not escape } func main() { _ = escapeExample() _ = noEscapeExample() }
結果は次のようになります:
./main.go:4:10: &x escapes to heap ./main.go:12:13: main escapes to heap
では、なぜこれらすべてを行うのでしょうか?この分析は、パフォーマンスの問題をデバッグするときに役立つことがわかります。変数は、ヒープではなくスタックに保存する方が適しています。変数がヒープにエスケープされる場所を見つけて、コードをリファクタリングして効率を高めることができます。
今日は何か新しいことを学べたでしょうか。
現在、API ドキュメント生成ツールである LiveAPI を構築中です。ぜひ試してみてください。
読んでいただきありがとうございます。
以上が基礎を超えた GoLang : エスケープ解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。