操作系统中的堆栈区别

堆和栈是内存分配的两种方式。栈用于存放函数局部变量和返回地址,具有LIFO特性,由操作系统自动分配回收,大小受限,溢出会触发异常。堆则需要程序员手动管理,适用于大容量内存分配,可能存在碎片问题。堆和栈在管理方式、空间大小、碎片、生长方向和分配效率上有所不同。
摘要由CSDN通过智能技术生成

堆和栈是两种内存分配的统称。

一.栈

  • 栈会存放函数的局部变量,函数的返回地址等。栈有"LIFO"(后进先出)的特点。
  • 栈由操作系统分配,自动回收.
  • 栈的大小受到限制。在x86体系下,栈一般通过esp 指向栈帧顶部,ebp指向底部
  • 不断的嵌套或者为局部变量分配空间,可能导致栈溢出。这时候会触发一个异常
  • 在执行完一个函数的时候,其中的变量都会从堆栈中弹出。
  • 无需亲自管理内存,变量会自动分配和释放。
  • 栈一般是高地址向低地址扩展,函数返回的时候,会通过返回原来的位置来释放空间。
  • 栈对应的是CPU的一级缓存,一级缓存在CPU内部,访问快,比较小

二.堆

  • 堆是计算机中不会自动管理的区域,不受CPU严格管理,它是内存中更加自由浮动的区域。
  • 我们可以通过封装好的函数(malloc/calloc/new…)来进行内存分配
  • 内核维护了一个brk指针,指向堆的顶部,将堆视为大小不同的块的集合来进行维护,每一个块就是一个连续的虚拟内存,要么是已经分配的,要么是空闲的,已经分配的块显式的保留为供应用程序使用,空闲块可以分配内存。
  • 堆是从低地址向高地址扩展,是不连续的内存区域。系统通过链表来存储空闲内存地址。
  • 一般在堆的头部用一个字节存放堆的大小。
  • 堆一般是CPU二级缓存,CPU和内存之间的地址,访问比一级缓存慢,但是比读内存快,容量比较大
  • 在多线程的情况下,线程有自己的栈,彼此共享创建他们
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值