栈[stack]和堆[heap]是两个编程时经常需要操作的内存空间。虽然接触两个概念很早,但只了解他们内存申请方式不同,其实它们的具体区别由很多,最重要的是申请方式,申请效率,和申请大小

申请方式

  • Stack: 由系统自动分配,开发人员无法自行分配。例如在声明函数的一个局部变量int b,系统自动在栈中为b开辟空间。
  • Heap: 由开发人员分配有些时候还需要明确指出大小长度,最常见的例子就是C语言中的malloc函数。

申请效率

  • Stack: 因为由系统自动分配,效率较高
  • Heap: 由程序员开辟和删除内存区域,容易产生内存碎片,或者内存溢出,虽然效率一般但是提供了足够的灵活性。

申请大小

  • Stack: 一般情况下,stack内存空间连续且有限,也就是说如果申请的内存空间超过栈的剩余空间,将提示栈溢出。
  • Heap: Heap的区间并不连续,一般由链表管理内存地址,所以相对于Stack,Heap要大很多。