堆和栈的区别

来源:互联网 发布:sql2005恢复数据库 编辑:程序博客网 时间:2024/06/08 23:39

关于堆和栈的区别讨论,分为两种情况

(1)数据结构中的堆和栈

(2)内存分配中的堆和栈

1.内存分配中的堆和栈的作用总结:

  • 栈为函数内部声明局部变量提供存储空间,自动变量
  • 进行函数调用时,过程活动记录存放于栈中
  • 通过malloc在堆中分配空间,该空间在调用函数结束之后仍有效

2.堆和栈的区别总结:

  • 栈是由编译器在程序运行时分配的空间,由操作系统维护
  • 堆是由malloc()函数分配的内存块,内存的管理由程序员手动控制,在C语言使用free()函数完成.主要区别有一下几点:

(1)管理方式不同

  • 程序在运行时栈由操作系统自动管理,无须程序员手工控制;由编译器进行分配和释放
  • 堆空间的申请、释放工作由程序员控制,容易产生内存泄露.malloc/free进程操作
(2)空间大小不同
  • 栈是向低地址扩展,是一块连续的内存区域.即栈顶的地址和栈的最大容量是系统预先规定好的,当申请的空间超过栈的剩余空间时,将出现栈溢出错误.
  • 堆是向高地址扩展,是不连续的内存区域.因为系统是用链表来存储空闲内存地址的,且链表的遍历方向是由低地址高地址.

(3)产生碎片不同

  • 对于堆来说,频繁的malloc/free势必会造成内存空间的不连续从而造成大量的碎片,使程序效率降低.
  • 对于栈来说,一定是连续的物理内存空间.
(4)增长方式不同
  • 在X86平台上,堆的增长方向是向上,即向着内存地址增加的方向;
  • 栈的增长方向是向下的,即向着内存地址减小的方向.
(6)分配效率不同
  • 栈是系统提供的,操作系统会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都是专门的指令执行.
  • 堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,则需要操作系统重新整理内存,搜索整理内存空间,这样就有机会分到足够大小的内存,然后返回.显然,堆的效率比栈要低的多.



0 0