堆和栈的区别

 

# 堆和栈的区别

  + 管理方式不同:堆中资源由程序员控制,容易产生内存泄漏,栈资源由编译器自动管理,无需手动控制;
  + 内存管理机制不同:系统有一个记录空闲列表的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆节点,删除空闲节点列表中的该节点,并将该节点空间分配给程序(大多数系统都会在这块内存空间首地址记录本次分配的大小,这样delete时才会释放本内存空间,另外系统会将多余的部分重新放入到空闲列表中);对于栈来说,只要栈的剩余空间大于所申请空间系统就为程序提供内存,否则报异常提示栈溢出。
  + 空间大小不同:堆是不连续的内存区域(因为系统使用链表来存储空间内存地址。自然是不连续的),堆大小受限于计算机系统中有效的虚拟地址(32位系统理论上是4G),所以堆的空间比较灵活,也比较大;栈是一块连续的内存区域,大小是操作系统预定好的,默认大小基本都是 MB级别。可调整。
  + 碎片问题不同:对于堆来说,频繁的调用 new/delete 会造成大量的碎片,使程序效率降低;对于栈它是一块连续的区域,不会产生碎片问题。
  + 生长方向不同:堆向上,向高地址方向增长;栈向下,向低地址方向增长。
  + 分配方式不同:堆都是动态分配;栈由静态分配和动态分配,静态分配由编译器完成(局部变量分配),动态分配由 malloc 函数分配,但栈的动态分配资源由编译器释放,无需程序员实现;
  + 分配效率不同:堆是由 C/C++ 函数库实现,机制复杂,所以堆的效率要比栈低;栈是由系统提供的数据结构,计算机在底层对栈进行支持,分配专门寄存器存放栈地址。栈操作由专门指令;
posted @   王清河  阅读(156)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-04-06 03-树1 树的同构 (25 分)
点击右上角即可分享
微信分享提示