1.程序内存布局场景下,堆与栈表示的是两种内存管理方式:
- 管理方式不同:栈是由操作系统自动分配释放,堆的申请和释放是由程序员手动控制
- 空间大小不同:每个进程拥有的栈的空间大小远远小于堆的空间
- 生长方向不同:栈的成长方向向下,从高到低,堆的生长方向向上,从低到高
- 分配方式不同:栈有静态分配和动态分配两种,静态分配是由操作系统完成的,比如局部变量的分配,动态分配是由allca函数进行分配,但这两种分配方式均由操作系统完成,堆都是动态分配,无静态分配
- 分配效率不同:栈的分配效率高于堆的分配效率
- 存放内容不同:栈存放的内容,返回函数的地址,相关参数,局部变量,寄存器内容等,堆中存放的内容由程序员决定
- 栈和堆相比不是那么灵活,有时候分配大量的内存空间,主要还是用堆
- 栈中存储的数据的生命周期随着函数的执行完成而结束,堆中存储的数据的若未释放,则其生命周期等同于程序的生命周期
- 堆和栈相比,由于大量malloc()/free()或new/delete的使用,容易造成大量的内存碎片
2.在数据结构场景中,栈和堆表示两种数据结构
-
栈是一种运算受限的线性表,有先进后出的特性,分为顺序栈和链式栈
-
堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆,堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆,如果根节点最大,称之为大顶堆。堆的左右孩子没有大小的顺序