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

“堆”和“栈”

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

比喻:

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

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

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

比喻:

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

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

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

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

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

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

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

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

相关文章:

  • matlab插值方法(简短)
  • 4G物联网模块实现废气处理全流程数据可视化监控配置
  • Android多媒体——媒体解码流程分析(十四)
  • Cursor 0.5版本发布,新功能介绍
  • 从零实现一个高并发内存池 - 2
  • WebGL知识框架
  • 网络协议分析 实验五 UDP-IPv6-DNS
  • openfeign与dubbo调用下载excel实践
  • Python知识框架
  • Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码
  • 【大模型】OpenManus 项目深度解析:构建通用 AI Agent的开源框架
  • Ubuntu——执行echo $USE什么都不显示
  • Turborepo + Vite + Next.js + Shadcn Monorepo 项目构建
  • 【JVS更新日志】企业文档AI助手上线、低代码、智能BI、智能APS、AI助手5.14更新说明!
  • Python如何解决中文乱码
  • 驾驭数据洪流:大数据治理的全面解析与实战方案
  • git使用的DLL错误
  • 线性规划求解及演示
  • 项目基于udp通信的聊天室
  • CPU的用户态(用户模式)和核心态(内核态)
  • 若依框架页面
  • 填涂颜色(bfs)
  • 如何恢复被勒索软件加密的服务器文件(解密与备份策略)
  • (C语言)超市管理系统(测试2版)(指针)(数据结构)(清屏操作)
  • 内存安全设计方案
  • FFmpeg 与 C++ 构建音视频处理全链路实战(五)—— 音视频编码与封装
  • vue 去掉右边table的下拉条与下面的白色边框并补充满
  • Android Activity之间跳转的原理
  • 试除法判断素数优化【C语言】
  • C语言:51单片机实现数码管依次循环显示【1~F】课堂练习