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

堆(heap)、栈(stack)

在程序中,栈和堆是两种非常重要的数据结构。它们都用来存储数据,但是它们的定义略有不同。

栈Stack:

栈是一种线性的数据结构,它以 “后进先出”(LIFO)的方式存储数据。栈中的内存空间在编译时就已经确定,大小固定,由编译器自动分配和释放。

在C语言中,栈主要用于存储局部变量、函数的参数、函数的返回值等。

栈具有如下特性:

(1)栈是一块连续的内存空间,由系统自动分配和释放。

(2)栈内存分配非常快,效率高。

(3)栈的大小有限,一般为几兆字节。

(4)栈内存空间的申请和释放是系统自动完成的。

堆Heap:

堆是一种非线性的数据结构,它以“随机访问”的方式存储数据。堆中的内存空间在程序运行时动态分配,大小不固定,需要在程序中进行手动的申请和释放。

在C语言中,堆主要用于存储动态数据结构,如数组、结构体、指针等。

堆具有如下特性:

(1)堆是一块非连续的内存空间。堆中的内存需要程序员手动分配和释放。

(2)堆中的内存分配速度较慢,效率相对较低。

(3)堆内存允许动态扩充,是非常灵活的数据结构。

(4)堆的容量比较大,一般为数百兆字节。

  1. 大量的分配和释放可造成内存碎片。
  2. 如果申请的缓冲区过大的话,可能申请失败。
  3. 可能造成内存泄露。

堆的内存申请以及释放方式:

new/delete 或者 malloc/free 来实现堆的申请和释放

区别:

1. 特性:

是动态分配的内存区域,可以动态改变大小,堆中的元素可以由程序员自行分配和释放。

是静态分配的内存区域,大小在程序编译时已经确定,栈中的元素是自动分配的,生命周期是函数执行期间。

2. 空间管理方式:

的空间由程序员手动分配和释放;

空间由操作系统自动管理。

3. 分配方式:

内存一般由程序员手动分配和释放;

内存由系统自动分配和释放。

4. 内存分配效率:

的分配与释放比较耗费时间,因为需进行复杂的内存管理;

的分配与回收非常快速,因为只需移动栈顶指针即可。

5. 访问速度:

的访问速度较慢,因为需要手动申请和释放空间,但可以存储较大的数据结构,非常灵活。

的分配和释放空间非常快速,因为它是由编译器自动完成的,存取速度也很快。但是,由于栈的空间有限,不能存储较大的数据,因此只适合存储较小的变量和数据;

6. 存储内容:

存储程序运行时动态分配的数据,如动态数组、链表等;

存储函数调用时的函数参数、局部变量、返回地址等。

堆和栈如何选择:

在编译之前知道所需分配数据的大小并且较小的时候,可以使用栈;

在运行期间你不知道会需要多大的数据或者你需要分配大量的内存的时候,建议你使用堆。

使用时需要限制删除或访问的数据结构时,可以使用栈;

需要进行元素的优先级排序,并实现常见的操作时,可以使用堆。

在栈上分配的内存由系统自动管理,无需开发人员手动管理,但是栈的内存空间通常较小,而堆可以灵活地分配和释放内存空间,但需要手动管理内存。因此,需要根据具体情况选择合适的存储方式。

其他:

栈是一种“后进先出”(Last-In-First-Out,LIFO)的数据结构,它是一种线性表,只允许在表的一端进行插入和删除数据。常用的操作包括:入栈(push)、出栈(pop)、栈顶元素访问(top)等。栈通常用来实现递归算法、表达式求值、括号匹配等。

堆是一种树形数据结构,具有“堆序”特性。堆通常是通过“完全二叉树”来实现的。堆可以分为最大堆和最小堆,其中最大堆要求父节点的键值大于或等于其子节点的键值,最小堆则要求父节点的键值小于或等于其子节点的键值。常用的操作包括:插入元素、删除堆顶元素等。堆通常用来实现优先队列等算法。

http://www.lryc.cn/news/89864.html

相关文章:

  • 企业级API网关之典型应用场景
  • 【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文
  • Rocket重试机制,消息模式,刷盘方式
  • linux+onenet可视化(图形化步骤)
  • 汇编的基础
  • 并发编程学习(十四):tomcat线程池
  • 简洁灵活工单管理系统,支持工单模版字段、工单状态自定义
  • 标签派单系统架构设计
  • Jmeter和Postman那个工具更适合做接口测试?
  • k8s污点与容忍
  • 市面上有哪些软件可以结合agentgpt的?众包平台结合的好处!
  • 【js】对象属性的拦截和Proxy代理与Reflect映射的用法与区别
  • Yolov8涨点神器:ODConv+ConvNeXt提升小目标检测能力
  • git代码回滚是使用reset还是revert
  • 深入理解Java ThreadLocal及其内存泄漏防范
  • 介绍10款ChatGPT替代产品
  • 数字逻辑 期末
  • MT4交易外汇平台有哪些优势?为何是外汇投资首选?
  • 问卷调查工具实力榜单发布
  • javascript中property和attribute有什么区别?
  • 快速上手kettle
  • Leetcode 399. 除法求值
  • kotlin协程并发/并行与串行互相切换,CoroutineScope与await
  • 初识linux之简单了解TCP协议与UDP协议
  • 【String——简单使用】
  • Python下Taobao封装API接口的优势
  • LeetCode 49 字母异位词分组
  • ( 链表) 142. 环形链表 II——【Leetcode每日一题】
  • 论文解读 | 基于改进点对特征的点云6D姿态估计
  • Shell脚本while循环语句应用