栈:

执行期间编译器自动分配,编译器用它实现函数调用,调用函数时,栈增长,函数返回时,栈收缩。局部变量、函数参数、返回数据、返回地址等放在栈中
栈的特点

  1. 内存分配取决于编译器,用户栈在程序运行期间可以动态的扩展和收缩。
  2. 和数据结构中的“栈”本质上是不一样的,但是操作方式类似于栈。
  3. 数据从栈中的进出满足“后进先出”的规律。
  4. 栈向低地址方向增长,esp(栈指针)指向栈顶元素。

    堆:

    动态储存器分配器维护着的一个进程的虚拟存储器区域。一般由程序员分配释放(堆在操作系统对进程初始化的时候分配),若程序员不释放,程序结束时可能由OS回收,每个进程,内核都维护着一个变量brk指向堆顶。
    堆的特点

  5. 内存分配取决于程序员,C/C++可以手动释放该片内存。

  6. 和数据结构的”堆“完全两回事,没有半点关系,在这里堆的结构更像链表。
  7. 所有的对象,包括数组的对象都存在堆上。
  8. 堆内存被所有的线程共享。
  9. 引用类型总是放在堆中。
  10. 堆向高地址方向增长,内核都维护的变量brk指向堆顶。