ローカル構造体へのポインターを返す
Go では、次のようなコード スニペットは、C のバックグラウンドを持つプログラマーにとって懸念を引き起こす可能性があります。
type point struct { x, y int } func newPoint() *point { return &point{10, 20} }
疑問が生じます: newPoint はスタック上の新しいポイントを割り当てるのか、それともheap?
ポインター エスケープ分析
答えは Go のポインター エスケープ分析にあります。関数を調べて、ポインター変数がローカル スタックからエスケープするかどうかを判断します。存在する場合、オブジェクトはヒープ上に割り当てられ、プログラム全体でメモリの安全性が確保されます。
このコード サンプルでは、ポインター変数は呼び出し元に返されるため、ローカル スタックからエスケープされます。したがって、Go はメモリの安全性を保証するためにポイント構造体をヒープに割り当てます。
ポインタがローカル関数からエスケープしなかった場合、コンパイラは自由にそれをスタック上に割り当てることができます。ただし、配置場所はポインタエスケープ解析の精度に依存するため保証されません。
以上がGo の `newPoint()` はスタックまたはヒープに構造体を割り当てますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。