ローカル構造体へのポインタを返す


85

次のような構造のコードサンプルがいくつかあります。

type point struct {
  x, y int
}

func newPoint() *point {
  return &point{10, 20}
}

私はC ++のバックグラウンドを持っていますが、エラーのようです。そのような構成のセマンティクスは何ですか?スタックまたはヒープに新しいポイントが割り当てられていますか?


1
同様の質問(ドキュメントへの回答のリンク):stackoverflow.com/questions/12098435/...
デニス・Séguret

DenysSéguret@それは類似していないのです
mangusta

回答:


109

Goはポインタエスケープ分析を実行します。ポインタがローカルスタックをエスケープすると(この場合はエスケープします)、オブジェクトはヒープに割り当てられます。ローカル関数をエスケープしない場合、コンパイラーはスタックに自由に割り当てることができます(ただし、保証はありません。ポインターエスケープ分析で、ポインターがこの関数に対してローカルのままであることを証明できるかどうかによって異なります)。


13
これは、Goのエスケープ分析をもう少し詳しく調べたブログ投稿(免責事項:私が書いたもの)です:scvalex.net/posts/29
scvalex

@LilyBallardはあなたの答えを完全には得られませんでした。ポインタをエスケープするという事実を証明することは常に可能ですが、エスケープしないという事実を証明することは不可能であるということですか?
mangusta

18

Golangの「ドキュメントには、ローカル変数へのポインタを返すことは完全に合法であると記載されています。」私がここを読んだように

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY

コンパイラはあなたがアドレスを返すのを見て、あなたのためにそれをヒープ上に置くように見えます。これはGoの一般的なイディオムです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.