在 Go 中获取地址并返回指向函数内部局部变量的指针会导致编译器将其分配在堆上而不是堆栈上,因此返回的指针仍然有效。
现在如果我获取并返回结构成员或嵌入式结构的地址会发生什么?
type A struct {
a,b,c int
}
type B struct {
A
d,e,f int
}
func (b *B) get1() *A {
return &b.A
}
func (b *B) get2() *A {
localB := B{}
return &localB.A
}
编译器会在堆上分配嵌入式结构 A 并将 B 的成员保留在堆栈上吗?
即使 localB.A 引用仍在使用中,垃圾收集器是否会收集 localB?
如果通过反射访问嵌入式结构,编译器如何确定何时将嵌入式结构保留在堆栈或堆上?
最佳答案
编译器执行 escape analysis确定一个变量是否可以在创建它的范围之外使用,在这种情况下,它必须分配在堆上。如果编译器可以确保不会发生这种情况,它就会在堆栈上分配变量。
然而,这是编译器的当前行为,但规范中并未提及,因此可能会在未来的任何版本中发生变化。
关于go - 在 Go 中返回结构成员或嵌入式结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42912601/