Golang中变量的分配位置是堆or栈

       我怎么知道一个变量是分配在堆上还是栈上?

       正确的观点是,你不需要知道。go语言中的每一个变量,它的生命周期和引用它的周期一样长。该语言的语义和实现时选择的存储位置,是没有关系的。

       在编写高效率的程序时,存储位置的确会有影响。如果可以,go语言编译器将会分配函数的局部变量到函数的栈帧上。然而,如果编译器不能证实局部变量在函数返回后,不会再被引用,编译器将必须分配该变量到垃圾回收堆上,以避免出现悬挂指针错误。如果一个局部变量非常大,那么存储在堆上比存储在栈上也更加合理。

       在当前的编译器里,如果一个变量的地址被调用了,这个变量将会候选分配在堆上。然而,一个基本转义分析会识别一些情况。在这些情况里,变量不会存活到函数返回,这些变量将分配到栈上。

 

例如下面这个函数是正确的,Go语言中没有C++中的构造函数,对象的创建一般交给一个全局的创建函数来完成:

func NewRect(x, y, width, height float64) *Rect {

return &Rect{x, y, width, height}

}

注意,这里与C/C++不同的是,返回一个局部变量的地址在Go语言中是绝对没有问题的;变量关联的存储在函数返回之后依然存在。

更直接的说,在Go语言中,如果一个局部变量在函数返回后仍然被使用,这个变量会从heap,而不是stack中分配内存。

结论:

Go 编译器自行决定变量分配在堆栈或堆上,以保证程序的正确性。参考https://blog.csdn.net/guyan0319/article/details/85236313

转载于:https://www.cnblogs.com/maji233/p/11048018.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值