- 主题:请教关于堆栈的理解是否正确
package main
import "time"
type Person struct {
}
// M 全局变量 放在堆上
var M map[string]*Person
func main() {
go CreatePerson()
time.Sleep(time.Second * 5)
}
func CreatePerson() {
// 下面这句,变量p 放在协程的栈上
p := &Person{}
// 执行下面这句,p会被复制到堆上吗?复制后,原来栈上的p变量在函数结束会被回收?
M["key"] = p
}
请教,上面的注释理解正确吗?
--
FROM 219.145.4.*
完全没有对内容的复制。
倒是指针被复制了一份。
【 在 BAIYUXIONG 的大作中提到: 】
: 标 题: 请教关于堆栈的理解是否正确
: 发信站: 水木社区 (Sat May 27 13:29:50 2023), 站内
:
: package main
:
: import "time"
:
: type Person struct {
: }
:
: // M 全局变量 放在堆上
: var M map[string]*Person
:
: func main() {
: go CreatePerson()
: time.Sleep(time.Second * 5)
: }
:
: func CreatePerson() {
: // 下面这句,变量p 放在协程的栈上
: p := &Person{}
: // 执行下面这句,p会被复制到堆上吗?复制后,原来栈上的p变量在函数结束会被回收?
: M["key"] = p
: }
:
: 请教,上面的注释理解正确吗?
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 219.145.4.*]
--
FROM 124.126.149.*
记得看到过说go对局部变量的返回做了优化,不用担心局部创建的对象被回收,具体可以搜一下相关的文章
--
FROM 117.133.145.*
这个没逃逸么?
--
FROM 223.72.41.*
可以搜一下:逃逸分析
【 在 BAIYUXIONG 的大作中提到: 】
: package main
: import "time"
: type Person struct {
: ...................
--
FROM 36.112.37.*
概念上go没有栈变量,只有gc管理的对象。局部变量无逃逸的时候被分配到栈上只是一种程序优化。
这样理解就顺了。
【 在 BAIYUXIONG 的大作中提到: 】
: package main
:
: import "time"
: ...................
--
FROM 114.249.210.*