堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式。其区别主要有五大点,分别为申请过程不同,申请大小限制不同,申请效率不同,以及存放堆数据不同。
一、什么是堆内存?
堆是在程序运行时申请的内存空间,即动态分配的内存。对堆内存访问和对一般内存的访问没有区别。一般由用户申请和释放,若用户没有释放,程序结束时可能由操作系统回收。
二、什么是栈内存?
栈内存是为线程留出的临时空间,每个线程都有一个固定大小的栈空间,而且栈空间存储的数据只能由当前线程访问,所以它是线程安全的。栈内存由操作系统自动分配和释放,存放函数的形参、局部变量等,其操作方式类似于数据结构中的栈(先进后出)。
三、堆和栈的区别
1、申请过程
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找名列前茅个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的 free 语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放回空闲链表中。
2、申请大小的限制
栈空间容量有限,不同的操作系统有2M、4M、8M。
堆空间因为是不连续的内存,所以空间非常大,取决于虚拟内存的大小。
3、申请的效率
栈空间由系统管理,申请速度很快。
堆空间过程繁琐,使用起来比较慢。
4、存放的数据不同
栈空间存放函数形参和局部变量,并且形参按照从右到左的顺序依次进入栈内存,最后是局部变量。
堆内存的内容由程序员自己决定。
以上就是关于堆和栈堆知识希望对大家有帮助。