关于堆和栈
程序内存分配中的堆和栈
栈内存存储的是局部变量而堆内存存储的是实体;
栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

C语言中使用malloc开辟空间,C++中使用new开辟空间,(new 和delete底层实际还是调用malloc)其开辟空间都在堆区
char* p1=(char *)malloc(10);
free(p1);
char* p2=new char[10];
delete[]p2;
堆的内存地址生长方向与栈相反,由低到高,但需要注意,后申请的内存空间并不一定在先申请的内存空间后面,即p2指向的地址并不一定大于p1所指向的内存地址,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系。堆中存储的数据若未释放,则其生命周期等同于程序的生命周期。

堆和栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有以下几种区别
a.管理方式不同,栈由操作系统分配释放,无需手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏
b.空间大小不同,每个进程拥有的栈大小要远远小于堆大小
c.生长方向不同,堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低
d.分配方式不同,堆都是动态分配的,没有静态分配;栈可以动态分配和静态分配,静态分配由操作系统完成,比如局部变量的分配,动态分配由alloca()函数完成;但是栈的动态分配和堆是不同的,由操作系统释放,无需我们手工实现
e.分配效率不同,栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多
f.存放内容不同,栈内存储局部变量,而堆内存储实体

数据结构中的堆和栈
栈是一种操作受限的线性表,限制是指只允许在表的一端进行插入和删除操作,这一端称为栈顶,另一端为栈底,特点是先进后出(FILO)
堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆(或小根堆),如果根节点最大,称之为大顶堆(或大根堆)。堆的左右孩子没有大小的顺序(堆的应用:堆排序<不稳定>)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具