news 2025/12/30 8:58:35

*栈(Stack)与堆(Heap)*的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
*栈(Stack)与堆(Heap)*的区别

**栈(Stack)与堆(Heap)**引用自:https://course.rs/basic/ownership/ownership.html
栈和堆是编程语言最核心的数据结构,但是在很多语言中,你并不需要深入了解栈与堆。 但对于 Rust 这样的系统编程语言,值是位于栈上还是堆上非常重要,因为这会影响程序的行为和性能。

栈和堆的核心目标就是为程序在运行时提供可供使用的内存空间。


栈按照顺序存储值并以相反顺序取出值,这也被称作后进先出。想象一下一叠盘子:当增加更多盘子时,把它们放在盘子堆的顶部,当需要盘子时,再从顶部拿走。不能从中间也不能从底部增加或拿走盘子!

增加数据叫做进栈,移出数据则叫做出栈。

因为上述的实现方式,栈中的所有数据都必须占用已知且固定大小的内存空间,假设数据大小是未知的,那么在取出数据时,你将无法取到你想要的数据。


与栈不同,对于大小未知或者可能变化的数据,我们需要将它存储在堆上。

当向堆上放入数据时,需要请求一定大小的内存空间。操作系统在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的指针,该过程被称为在堆上分配内存,有时简称为 “分配”(allocating)。

接着,该指针会被推入栈中,因为指针的大小是已知且固定的,在后续使用过程中,你将通过栈中的指针,来获取数据在堆上的实际内存位置,进而访问该数据。

由上可知,堆是一种缺乏组织的数据结构。想象一下去餐馆就座吃饭:进入餐馆,告知服务员有几个人,然后服务员找到一个够大的空桌子(堆上分配的内存空间)并领你们过去。如果有人来迟了,他们也可以通过桌号(栈上的指针)来找到你们坐在哪。

性能区别
在栈上分配内存比在堆上分配内存要快,因为入栈时操作系统无需进行函数调用(或更慢的系统调用)来分配新的空间,只需要将新数据放入栈顶即可。相比之下,在堆上分配内存则需要更多的工作,这是因为操作系统必须首先找到一块足够存放数据的内存空间,接着做一些记录为下一次分配做准备,如果当前进程分配的内存页不足时,还需要进行系统调用来申请更多内存。 因此,处理器在栈上分配数据会比在堆上分配数据更加高效。

所有权与堆栈
当你的代码调用一个函数时,传递给函数的参数(包括可能指向堆上数据的指针和函数的局部变量)依次被压入栈中,当函数调用结束时,这些值将被从栈中按照相反的顺序依次移除。

因为堆上的数据缺乏组织,因此跟踪这些数据何时分配和释放是非常重要的,否则堆上的数据将产生内存泄漏 —— 这些数据将永远无法被回收。这就是 Rust 所有权系统为我们提供的强大保障。

对于其他很多编程语言,你确实无需理解堆栈的原理,但是在 Rust 中,明白堆栈的原理,对于我们理解所有权的工作原理会有很大的帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/18 15:27:29

【学术干货 | 学术海报Poster模板分享】科研成果展示 | 参加国际学术会议海报制作(poster)模板 | 学术会议海报参考 | 附赠90+会议poster模板 | 免费资源 | 免费下载

学术海报(Poster)模板的适用人群广泛,主要服务于需要以可视化形式展示研究成果的学术或专业场景: 人群核心需求模板设计侧重点本科生首次接触学术展示,需清晰引导简化结构、增加示例注释、基础图表模板硕士/博士生展示…

作者头像 李华
网站建设 2025/12/27 18:48:57

突破数据壁垒:AppFlowy分布式同步技术的革命性实践

突破数据壁垒:AppFlowy分布式同步技术的革命性实践 【免费下载链接】AppFlowy AppFlowy 是 Notion 的一个开源替代品。您完全掌控您的数据和定制化需求。该产品基于Flutter和Rust构建而成。 项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowy 你是…

作者头像 李华
网站建设 2025/12/28 12:47:19

5分钟快速上手:Masa全家桶模组中文界面完整配置指南

5分钟快速上手:Masa全家桶模组中文界面完整配置指南 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Masa系列模组的英文界面而烦恼吗?每次使用itemscrolle…

作者头像 李华
网站建设 2025/12/28 20:48:45

HumanML3D深度解析:构建3D人体运动语言数据集的技术实践

HumanML3D深度解析:构建3D人体运动语言数据集的技术实践 【免费下载链接】HumanML3D HumanML3D: A large and diverse 3d human motion-language dataset. 项目地址: https://gitcode.com/gh_mirrors/hu/HumanML3D 在人工智能和计算机视觉领域,3D…

作者头像 李华
网站建设 2025/12/28 20:48:42

IQ-TREE2系统发育树构建实战指南:从入门到精通

还在为复杂的系统发育分析头疼吗?IQ-TREE2作为一款基于最大似然法的高效系统发育分析工具,能够帮你轻松解决这个难题。无论是处理小型基因数据集还是开展基因组规模的系统发育分析,这款开源软件都能满足你的需求。 【免费下载链接】iqtree2 N…

作者头像 李华