go - 在 Go 中返回结构成员或嵌入式结构的指针?

标签 go pointers struct heap-memory

在 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/

相关文章:

concurrency - 两个例程在同一个 channel 上通信

c - 在 C 中返回字符串的正确方法

指针和结构的 C++ 邻接表

go - Axios 和 fetch 在 Golang 中给出空映射,即使在 url 编码时(添加了 header )

mongodb - 做一个困难的mongoDB查找

c++ - 变量指针的成员函数没有绘制到 SDL_Surface?

c - 如何在 C 中使用指向结构的指针从结构中打印成员数据

c++ - std::atomic 和自定义结构的问题

go - Golang 中的 HTTP 重定向

C 指针表示法与数组表示法比较 : When passing to function