【golang】变量的stack与heap分配

dongzaidong · · 985 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

堆栈定义

  • 栈 stack:由操作系统自动释放,存放函数的参数值、局部变量等,更新速度快。
  • 堆 heap:一般由程序员释放,在Golang中自动垃圾回收gc掉,存放全局变量、共享变量等。

golang 参数传递重点

  • 使用值传递,该值存放在stack上,当return时候会自动释放。
  • 使用引用传递,该值存放在heap上,需要gc。

使用引用传递,因为复制的是一份地址,减少大的结构体传递的内存占用。但因为存放在heap上需要垃圾回收掉,运行速度要比值传递慢。所以出来共享传递参数外,尽量值传递

golang 变量函数中分配位置

go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析(escape analysis),当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。

在c/c++,一般通过new(动态申请)出来的变量,都会存放在heap上,而对于golang则是:
Golang中一个函数内局部变量,不管是不是动态new出来的,它会被分配在堆还是栈,是由编译器做逃逸分析之后做出的决定。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:dongzaidong

查看原文:【golang】变量的stack与heap分配

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

985 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传