返回指向局部结构体的指针

111

我看到一些代码示例中有这样的结构:

type point struct {
  x, y int
}

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

我有C++的背景,但这对我来说似乎是一个错误。这种结构的语义是什么?新点分配在堆栈还是堆上?


1
一个类似的问题(答案链接到文档):https://dev59.com/sGfWa4cB1Zd3GeqPi58C - Denys Séguret
1
@DenysSéguret 这并不相似。 - mangusta
2个回答

135

Go语言执行指针逃逸分析。如果指针逃逸出本地堆栈,就像在这种情况下一样,对象将分配到堆上。如果它没有逃逸出本地函数,则编译器可以自由地将其分配到栈上(尽管它不作任何保证;这取决于指针逃逸分析是否能够证明指针仍然局限于本函数)。


16
这是一篇博客文章(免责声明:我写的),更深入地探讨了Go语言的逃逸分析:http://www.scvalex.net/posts/29/ - scvalex
1
@LilyBallard没有完全理解您的答案。 您的意思是证明指针是否被逃逸总是可能的,而证明未被逃逸的事实则不可能? - mangusta
3
2022年scvalex帖子的有效链接:https://web.archive.org/web/20160923043317/https://www.scvalex.net/posts/29/ - Max

21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接