局部变量分配在栈上还是堆上?

存储 存储软件
一般来说,局部变量的作用域仅在该函数中,当函数返回后,所有局部变量所占用的内存空间都将被收回,对于这类变量,都是从栈上分配内存空间,这一点大家应该是没有争议的。

[[426263]]

大家好,我是明哥。

本专栏内容,已经上传 github:https://github.com/iswbm/golang-interview

请大家帮帮忙去点个小 ??,在那里我对题库进行了分类整理。

本篇问题:局部变量分配在栈上还是堆上?

# 什么是堆内存和栈内存?

根据内存管理(分配和回收)方式的不同,可以将内存分为 堆内存 和 栈内存。

那么他们有什么区别呢?

堆内存:由内存分配器和垃圾收集器负责回收

栈内存:由编译器自动进行分配和释放

一个程序运行过程中,也许会有多个栈内存,但肯定只会有一个堆内存。

每个栈内存都是由线程或者协程独立占有,因此从栈中分配内存不需要加锁,并且栈内存在函数结束后会自动回收,性能相对堆内存好要高。

而堆内存呢?由于多个线程或者协程都有可能同时从堆中申请内存,因此在堆中申请内存需要加锁,避免造成冲突,并且堆内存在函数结束后,需要 GC (垃圾回收)的介入参与,如果有大量的 GC 操作,将会吏程序性能下降得历害。

# 局部变量是从哪里分配的?

在函数里声明定义的变量,我们称之为局部变量。

一般来说,局部变量的作用域仅在该函数中,当函数返回后,所有局部变量所占用的内存空间都将被收回,对于这类变量,都是从栈上分配内存空间,这一点大家应该是没有争议的。

可有一种局部变量,比较特殊。

这种局部变量,虽然在函数里声明定义,但是在函数外还会持续的使用。

对于这类局部变量,显然我们是不希望函数退出后将其销毁的。

那怎么办呢?可以从堆区分配内存空间给这类局部变量。

不过这个事实其实不用程序员操心,Go 的编译器会自行判断做优化的。但我们仍然需要知道这个知识点(因为面试会问哈哈)

本文转载自微信公众号「Go编程时光」,可以通过以下二维码关注。转载本文请联系Go编程时光公众号。

 

责任编辑:武晓燕 来源: Go编程时光
相关推荐

2010-10-14 09:34:34

JVM局部变量

2009-09-17 13:05:38

Linq局部变量类型

2009-08-26 16:37:07

C#迭代器局部变量

2018-05-14 09:15:24

Python变量函数

2009-12-15 10:48:54

Ruby局部变量

2020-11-11 21:26:48

函数变量

2009-09-11 10:07:05

Linq隐式类型化局部

2009-10-12 14:13:00

VB.NET使用局部变

2015-01-07 14:41:32

Android全局变量局部变量

2010-03-15 09:32:56

Python函数

2009-08-27 10:08:36

C#隐含类型局部变量

2017-02-08 12:28:37

Android变量总结

2022-12-12 08:42:06

Java对象栈内存

2009-09-22 17:21:24

线程局部变量

2023-09-24 23:40:54

Python变量

2012-07-11 23:10:49

SQL Server数据库

2009-08-26 15:39:08

C#隐式类型局部变量

2011-11-23 10:59:18

Javafinal

2010-01-08 15:22:22

VB.NET局部变量

2010-01-20 10:27:07

VB.NET隐式类型局
点赞
收藏

51CTO技术栈公众号