我正在读一本叫做《Go 编程语言》的书,在关于指针的第二章中写了以下内容
函数返回局部变量的地址是完全安全的。例如,在
在下面的代码中,由对 f 的特定调用创建的局部变量 v 即使是仍然存在
调用返回后,指针 p 仍将引用它:
var p = f()
func f() *int {
v := 1
return &v
}
我完全不明白这一点,局部变量应该在函数执行后被销毁。是因为可能 v 分配在堆上吗?我知道在 C 中,如果使用 malloc 分配空间,它在函数执行后不会被销毁,因为它位于堆上。
Go 不是 C。尽管有相似之处,但它的级别要高得多。它利用带有绿色线程调度程序和垃圾收集内存管理器的完整运行时。只要它有实时引用,它就永远不会收集内存。
Go 编译器包含一个称为“转义分析”的阶段,它会跟踪每个变量以查看它是否“转义”声明它的函数。任何可以逃逸的值都会在堆上分配并由垃圾收集进行管理;否则,它(通常)在堆栈上分配。
您可以找到有关该主题的更多信息:
- https://blog.golang.org/ismmkeynote https://blog.golang.org/ismmkeynote
- https://dave.cheney.net/2014/06/07/ Five-things-that-make-go-fast https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast
- https://dougrichardson.org/2016/01/23/go-memory-allocations.html https://dougrichardson.org/2016/01/23/go-memory-allocations.html
- https://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html https://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html
- https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-escape-analysis.html https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-escape-analysis.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)