堆和栈的区别要从两方面来讲:
一、数据结构
1.栈内存是由系统分配,系统释放,以函数为单位进行栈内存分配,函数栈帧、局部变量、形参变量都存储在栈内存上
堆内存是由用户自己分配的,C语言用malloc/free进行申请/释放内存,C++用new/delete进行申请/释放内存,
由于堆需要用户自己管理,因此内存很容易造成泄露,而栈不会。
2.栈的内存分配释放速度快,效率高,内存都是连续的
堆内存的分配释放相对来说效率低一些,内存不一定连续,容易产生内存碎片,但灵活性高
二、虚拟地址空间
首先,我们了解下C++中虚拟地址空间的布局
保留区:保留区也称为不可访问区,用于存储C的库与操作系统相关的函数,只由操作系统调用。
.text指令段:存放指令
.data数据段:已初始化的数据且初始化数据不为零
.bss数据段:未初始化的数据或初始化数据为零
heap堆区:低地址往高地址开辟
共享库
stack栈区:所有函数的活动空间
命令行参数:传递参数
环境变量:可以拿到库的头文件
ZONE_DMA直接内存访问:针对数据流向,不经过寄存器
ZONE_NORMAL常用部分:虚拟空间和内存的映射关系
ZONE_HIGHMEM高端内存:大文件的映射
由上可得:
栈是由高地址像低地址扩展的连续内存,栈的大小一般为2M或者10M
堆是由低地址向高地址扩展的非连续内存,堆的大小影响因素较多,和系统虚拟地址内存的大小有关。