go中的堆和栈

我们定义的变量存放在堆还是栈中?一般是这么来分配的

堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵

栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

那么go中的全局变量和局部变量都是放在哪里呢?

1. 首先要搞清楚变量的生命周期

生命周期是指程序执行过程中变量存在的时间段。

(1)包变量(全局变量) 一直常驻在内存中知道程序的结束,然后被系统垃圾回收,也就是说包变量的生命周期是整个程序的执行时间

(2)局部变量 在函数中定于的变量,它有一个动态的生命周期:每次执行的时候就创建一个新的实体,一直生存到没有人使用(例如没有外部指针指向它,函数退出的时候没有路径访问到这个变量)这个时候它占用的空间就会被回收

结论:并不是定义在函数内部的局部变量在访问退出函数时候就被回收!

2. 堆和栈的分配

变量定义完成一般是分配在堆和栈空间上的。存在哪个空间上是跟你是否动态分配内存有关(new/malloc)。但是在Go语言上这个选择并不是基于使用var和new关键字来声明变量的。

var p *int    //全局指针变量
func f(){
    var i int
    i = 1
    p = &i    //全局指针变量指向局部变量i
}
func f(){
    p := new(int) //局部指针变量,使用new申请的空间
    *p = 1
}

第一个demo中,使用var定义局部变量,但是由于 将引用赋值给全局指针变量p,当函数结束,此时i并不会被释放,所以局部变量i是申请在堆上(程序员手动释放)

第二个demo中,使用new申请空间,由于退出函数p会被释放,所以p是申请在栈上(自动释放)

Go语言区别于C/C++,虽然变量申请在堆空间上,但是它有自动回收垃圾的功能,所以这些堆地址空间也无需我们手动回收,系统会在需要释放的时刻自动进行垃圾回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值