[[426263]]
大师好,我是明哥。
本专栏践诺,还是上传 github:https://github.com/iswbm/golang-interview
请大师帮维护去点个小 ??,在那里我对题库进行了分类整理。
本篇问题:局部变量分派在栈上照旧堆上?
# 什么是堆内存和栈内存?说明内存惩处(分派和回收)神志的不同,不错将内存分为 堆内存 和 栈内存。
那么他们有什么区别呢?
堆内存:由内存分派器和垃圾蚁合器精致回收
栈内存:由编译器自动进行分派和开释
一个要津启动进程中,也许会有多个栈内存,但详情只会有一个堆内存。
每个栈内存齐是由线程梗概协程寂然占有,因此从栈平分派内存不需要加锁,况且栈内存在函数限制后会自动回收,性能相对堆内存好要高。
而堆内存呢?由于多个线程梗概协程齐有可能同期从堆中肯求内存,因此在堆中肯求内存需要加锁,幸免形成冲破,况且堆内存在函数限制后,需要 GC (垃圾回收)的介入参与,若是有多数的 GC 操作,将会吏要津性能着落得强烈。
# 局部变量是从那边分派的?在函数里声明界说的变量,咱们称之为局部变量。
一般来说,局部变量的作用域仅在该函数中,当函数复返后,系数局部变量所占用的内存空间齐将被收回,关于这类变量,齐是从栈上分派内存空间,这小数大师应该是莫得争议的。
可有一种局部变量,相比出奇。
这种局部变量,天然在函数里声明界说,然而在函数外还会捏续的使用。
关于这类局部变量,显明咱们是不但愿函数退出后将其葬送的。
那若何办呢?不错从堆分辨派内存空间给这类局部变量。
不外这个事实其实无用要津员牵记,Go 的编译器会自行判断作念优化的。但咱们仍然需要知谈这个学问点(因为口试会问哈哈)
本文转载自微信公众号「Go编程时光」,不错通过以下二维码关怀。转载本文请有关Go编程时光公众号。
kaiyun