go语言的局部变量在堆上还是栈上?
2024-09-06 17:44:01
在讨论之前,先看如下代码:
type treeNode struct {
value int
left, right *treeNode
} func createNode(value int) *treeNode {
return &treeNode{value:value}
} func main() {
root := createNode()
fmt.Println(root)
}
上面这段代码createNode函数返回了一个局部变量的地址给main函数中的root,但是fmt.Println正常打印出来了新建的node的内容。这要是在C++中这么写,是个很典型的错误:返回局部变量的地址,该地址的内容在函数退出后会被自动释放,因为是在栈上的。
那么go语言的局部变量到底是在栈上还是堆上呢?go语言编译器会做逃逸分析(escape analysis),分析局部变量的作用域是否逃出函数的作用域,要是没有,那么就放在栈上;要是变量的作用域超出了函数的作用域,那么就自动放在堆上。所以不用担心会不会memory leak,因为go语言有强大的垃圾回收机制。这样可以释放程序员的内存使用限制,让程序员关注程序逻辑本身。
对于new出来的局部变量,也不是一定就放在堆上,而是根据其是否超出了函数作用域来判断是否放在堆上还是栈上。这点和C语言很不一样。
最新文章
- 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
- 《linux命令》ps -aux详细解释
- Jmeter常见问题
- 神奇的HTML5离线存储(应用程序缓存)
- 在CentOS下利用Eclipse调试FFmpeg
- phpstorm配置xdebug
- Maven聚合
- mysql 安装后无法登陆mysql的 shell 那mysql&;gt;经验:ERROR 1045 (28000): Access denied for user &;#39;root&;#39;@&;#39;localhost‘
- 重读The C programming Lanuage 笔记一:类型转换
- 51nod_1100:斜率最大
- FPGA时序约束——理论篇
- 第三章· Redis消息队列
- 爬虫_拉勾网(selenium)
- W3School 学习笔记
- Github的简易操作
- FPGA内部动态可重置PLL讲解(二)
- 日志工具——log4j
- MT【127】点对个数两题之一【图论】
- XML 和 JSON 的使用场景
- dotnet core webapi +vue 搭建前后端完全分离web架构(一)