Stack

  • Stack 是一个特殊的区域,它用来存储 function 所用到的临时变量。 Stack 是一种FILO(先进后出)的数据结构,由 CPU 来管理和优化
  • 程序员自己不需要手动管理 stack 中的内存
  • 当 function 申明一个新变量,它就即可被 push 到 stack 中
  • 当 function exits 时,所有在 stack 中的变量都会被释放
  • 当变量被释放之后,那些 memory 的区域会被别的 stack 变量使用
  • 所以,stack 中的 variable (变量)有一个所谓的 variable scope
  • 也就是说,我们平时用的 local variable 在 function exits 之后,也就被释放了(lost forever)
  • Stack 中的 memory 空间是有限制的,variable 不能无限 push 到 stack 中,不然会引起 “stack overflow”

Heap

  • Heap 中的内存一般需要程序员自己的手动管理
  • 一旦在 Heap 中分配了一段内存,必须手动清除
  • 如果分配的内存在使用完毕后没有被清除,会发生 memory leak(内存泄露),
  • Heap 中的内存没有大小限制(电脑物理内存不考虑的情况下)
  • 与 Stack 不同,Heap 中的 variable 可以被所有 function 共享

在多线程中,Stack和Heap如何配合工作?

  • 在一个多线程的应用中,每条 thread 都有自己的 stack,但是所有的 thread 共享同一个 heap
  • 每条 thread 必须相互协调配合,避免多条线程同一时间访问相同的 heap memory

在 Stack 和 Heap 中,内存持续保存的时间如何?

  • function 从开始到结束,stack 中的内存会被自动释放
  • function 结束时,heap 中的内存需要程序手动释放

Stack 和 Heap 的空间大小

  • Stack 的大小是固定的,它不能被增加。如果 stack 发现内存不足,会发生传说中的 stack overflow
  • Heap 的大小由操作系统控制,当 heap 内存不够是,系统可以自动分配空间给它,这是它和 stack 区别最大的地方

Stack 和 Heap,哪个更快?

  • Stack 的速度远快于 heap,stack 是用栈结构(数据结构)实现,可以利用指针的移动分配或者清除内存

什么会导致 Stack 和 Heap 出错?

  • 当 stack 的内存溢出时,程序会崩溃
  • 由于 Heap 中的 block 储存方式是 noncontiguous ,过多的 fragmentation (存储残片)可能会导致新的内存不能被分配,因此引起 Heap 出错

使用 stack 还是 Heap ?

  • 对于一个新手来说,尽量使用 stack,因为它操作简单。当你能确定使用的 memory 很小而且你知道它确切的大小,那么使用 stack 无疑
  • 但是如果你不能确定你需要使用的 memory 确切的大小,那么 heap 就是一个更好的选择