Akiyama_tsuki

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

go语言逃逸分析

GO语言中的逃逸分析的说明

在C语言和C++中可以使用new和malloc动态的分配内存,这种方式分配的内存是在堆上分配的,不会随着函数调用的结束而释放,这就要求程序员必须记得要在合适的时候释放这些内存,但总是会由于疏漏或者粗心导致忘记释放,这就导致了C语言和C++中的一个经典问题———内存泄露。
在Java等语言中,使用的是垃圾回收机制来处理这个问题,在go语言中,在垃圾回收机制上增加了编译器的逃逸分析

在编译原理中,把分析指针的动态范围成为逃逸分析
通俗的,当一个对象的指针被多个方法或进程引用时,说明该指针逃逸了,逃逸分析就是分析某个指针是否逃逸。
在go语言中,逃逸分析决定一个内存会分配在堆上还是栈上。编译器会对指针进行逃逸分析,如果一个指针在函数中用过后便不再使用(未逃逸),就分配在栈上,即使是使用new创建。如果分析出某一个指针在函数外还有使用(逃逸),就在堆上为它分配内存。
go语言通过逃逸分析,把不需要分配在堆上的内存分配在栈上,在栈上分配内存快,而且会随着函数的返回自动释放,不需要调用消耗巨大的垃圾回收机制,有效的提高了效率。

go语言逃逸分析的原则就是:如果一个函数返回一个引用就认为他发生了逃逸。
具体的做法是:编译器分析代码的特征和生命周期,当某个函数内声明的变量确实不会在函数外被引用时,该变量会分配在栈,其他情况则会分配在堆上,由垃圾回收机制回收。
go语言中没有任何方法可以指定某一个变量必须分配在堆或栈上,分配在哪里由编译器决定,对于程序员来说,操作透明,堆栈界限模糊。
总的来说

  1. 当变量在函数外确定没有引用,分配在栈上
  2. 当变量在函数外有引用,分配在堆上。除此外,在外界没有引用,但占用内存过大无法分配在栈上的变量,也会分配在堆上。

posted on   Akiyama_tsuki  阅读(33)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示