当前位置: 首页 > news >正文

“堆”和“栈”

一、什么是“栈”?(Stack)

比喻:

想象你在厨房里做饭,有一堆碗盘,一次只拿一个放进去,拿出来也是“后进先出”的(后放进去的先拿出来),这就像“栈”。

通俗解释:
  • 存储位置:栈就像一叠书或者碗,在一定的空间里,按顺序堆放。
  • 特点
    • 后进先出(LIFO,Last In First Out):最新放进去的内容,最先被取出来。
    • 存储内容:主要用来存放局部变量、函数调用的返回地址、函数参数等临时信息。
    • 自动管理:由程序自动控制,不需要 programmer 特别管理。
    • 空间大小:有限制,超出会“栈溢出”。
  • 例子
    • 调用函数时,相关信息放到栈上,函数执行完后自动弹出。
    • 在代码中定义的局部变量,存放在栈里。

二、什么是“堆”?(Heap)

比喻:

堆就像一个灵活的大仓库或仓库的货架,任何时候你都可以存放或取出你需要的东西,没有限制你放在哪里。想象你在超市买了好多东西,堆满了你的购物车。

通俗解释:
  • 存储位置:堆是用来存放“动态分配”的对象,比如程序运行中创建的对象、字符串、数组等。
  • 特点
    • 动态管理:需要程序员自己告诉系统“我想在堆上分配空间”,用完了还要“释放”。
    • 空间灵活:没有严格的顺序限制,空间比栈大很多。
    • 管理复杂:程序要负责分配和释放空间,否则会出现“内存泄漏”。
    • 空间大小:相对较大,没有硬性限制,但也受限于系统总内存。
  • 例子
    • 在程序中用new或者malloc()分配的内存块,就是堆上的空间。
    • 存放在堆里的对象,可以跨函数调用,只要引用还在。

三、总结“栈”和“堆”的区别:

特点栈(Stack)堆(Heap)
管理方式自动管理,程序自动入栈和出栈需要程序员手动申请和释放(如newmalloc()
存储内容函数的局部变量、返回地址、参数等临时信息动态创建的对象、数据、数组等,生命周期由程序控制
空间大小很有限(一般几兆到几百兆),空间受限大得多,可以处理几百兆甚至几GB,受系统总内存限制
访问速度很快,因连续的内存空间,CPUCache友好比较慢,碎片化严重,管理复杂
速度和安全性高速,避免了碎片问题,但有限制灵活但易出错(如内存泄漏、悬挂指针)
用途临时存放局部变量、函数调用信息存放动态分配的对象,比如用new创建的对象

四、用个通俗的比喻总结:

  • 栈就像“叠碗”:你只会把新碗放在上面,拿碗也是从最上面拿。
  • 堆就像“仓库”:任何时间你都可以去仓库里存放东西,也可以拿出来,要自己管理。

五、额外提醒(关于内存)

  • :由操作系统自动管理,效率高,但空间有限,容易溢出(比如递归太深)。
  • :由程序员自己管理(在C/C++中),灵活但需要小心内存泄漏和碎片。

相关文章:

  • KUKA机器人中断编程3—暂停功能的编程
  • 【C++ / STL】封装红黑树实现map和set
  • 龙虎榜——20250514
  • Spring中的循环引用
  • 0514得物、0509滴滴面试总结复盘
  • 团结引擎 1.5.0 发布,抖音小游戏平台即将开放、Shader Graph功能新增…引擎能力再提升!
  • sql sql复习
  • 如何下载 Microsoft SQL Server Management Studio 2019
  • VCS758电流传感器芯片:国产化替代与高精度电流检测解决方案
  • 开发指南112-样式的优先级别
  • Python爬虫实战:研究拦截器,实现逆向解密
  • Java死锁排查:线上救火实战指南
  • 《P4391 [BalticOI 2009] Radio Transmission 无线传输 题解》
  • 数据清洗ETL
  • 性能比拼: Linkerd vs. Istio
  • 《Light》北京大学联合团队突破量子计算微型化革命:0.1毫米超表面集成多逻辑门,效率提升95%
  • 自动化 NuGet 包打包与上传:完整批处理脚本详解(含 SVN 支持)
  • Milvus 视角看重排序模型(Rerankers)
  • Java 中序列化和反序列化的详细说明
  • Java Spring Boot 控制器中处理用户数据详解
  • 鸿海下调全年营收展望:AI服务器业务强劲,预计今年营收增超50%
  • 秘鲁总统任命前司法部长阿拉纳为新总理
  • 中国科学院院士、我国航天液体火箭技术专家朱森元逝世
  • 白玉兰奖征片综述丨动画的IP生命力
  • 山东省市监局“你点我检”专项抽检:一批次“无抗”鸡蛋农兽药残留超标
  • 时隔4年多,这一次普京和泽连斯基能见面吗?