首页 > 其他 > 详细

堆和栈的区别

时间:2021-04-06 20:41:18      阅读:25      评论:0      收藏:0      [点我收藏+]

 

# 堆和栈的区别

  + 管理方式不同:堆中资源由程序员控制,容易产生内存泄漏,栈资源由编译器自动管理,无需手动控制;
  + 内存管理机制不同:系统有一个记录空闲列表的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆节点,删除空闲节点列表中的该节点,并将该节点空间分配给程序(大多数系统都会在这块内存空间首地址记录本次分配的大小,这样delete时才会释放本内存空间,另外系统会将多余的部分重新放入到空闲列表中);对于栈来说,只要栈的剩余空间大于所申请空间系统就为程序提供内存,否则报异常提示栈溢出。
  + 空间大小不同:堆是不连续的内存区域(因为系统使用链表来存储空间内存地址。自然是不连续的),堆大小受限于计算机系统中有效的虚拟地址(32位系统理论上是4G),所以堆的空间比较灵活,也比较大;栈是一块连续的内存区域,大小是操作系统预定好的,默认大小基本都是 MB级别。可调整。
  + 碎片问题不同:对于堆来说,频繁的调用 new/delete 会造成大量的碎片,使程序效率降低;对于栈它是一块连续的区域,不会产生碎片问题。
  + 生长方向不同:堆向上,向高地址方向增长;栈向下,向低地址方向增长。
  + 分配方式不同:堆都是动态分配;栈由静态分配和动态分配,静态分配由编译器完成(局部变量分配),动态分配由 malloc 函数分配,但栈的动态分配资源由编译器释放,无需程序员实现;
  + 分配效率不同:堆是由 C/C++ 函数库实现,机制复杂,所以堆的效率要比栈低;栈是由系统提供的数据结构,计算机在底层对栈进行支持,分配专门寄存器存放栈地址。栈操作由专门指令;

堆和栈的区别

原文:https://www.cnblogs.com/wanghao-boke/p/14623375.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!