94

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

type point struct {
  x, y int
}

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

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

4

2 に答える 2

116

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

于 2012-12-05T02:15:37.817 に答える
19

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

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

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

于 2012-12-05T02:15:31.130 に答える