内存中栈和堆的作用和区别

首先内存中的堆栈和数据结构中的堆栈是不同的两个东西。

内存中分为栈和堆,以及静态存储区、程序代码区等。

内存模型:

内存中栈和堆的作用和区别


从空间上和存放内容上来说:

栈:内存空间小一些,栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生*Error问题。主要存放函数体的地址、函数的参数、局部变量临时变量等。

堆:内存空间大一些,主要存放一些通过new出来的对象或者malloc申请的内存空间。

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

程序代码区:主要用于存放程序的二进制代码的空间。



从申请释放方式上来说:

栈:由编译器或者系统自动申请和回收,不受我们的控制。栈是为单个线程分配的,每个线程的栈空间是不一样的。当一个线程申请栈空间时,只要栈剩余的空间大小比申请的空间小,系统就自动为其分配空间,并且分配的空间是连续的,否则就会报错说明栈空间溢出。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。

堆:分配的空间不连续,并且堆是为一个程序分配的,多个线程公用同一个堆内存。内存由我们自己手动申请和释放,例如malloc和new即可申请堆内存,free和delete即可将堆内存释放。如果我们不对堆内存释放,那么程序结束时会由系统自动回收。不过最好还是手动释放,防止出现内存泄漏。因为操作系统中有一个存放空闲存储块的链表,当程序员申请空间的时候,系统就会遍历整个链表,找到第一个比申请空间大的空闲块节点,系统会将该空闲块从空闲链表中删除,分配给程序,同时系统会记录这个空闲块的首地址和申请的大小,当程序员使用delete释放该空间的时候能够找到该存储区。另外,申请的空间不一定与找到的空闲块大小相同,多出来剩余的空闲区会被系统重新添加到空闲链表中。


从访问速度来说:

栈:因为栈是连续的内存,操作通常集中在一个内存块的附近,有利于处理器的高速访问。

堆:因为一般申请的堆内存都是不连续的,所以访问起来也要慢一些。