管理方式不同
- 栈是由编译器自动管理,无需我们手工控制
- 堆的释放工作是由程序员控制,容易产生memory leak(内存泄漏)
生长方向不同
栈是向下生长,堆是向上生长
空间大小不同
- 由于栈是向下增长,所以它的大小受限于系统(软限制),windows下为1M,Linux下为8M。Linux命令行中输入:“ ulimit -a ”便可以显示栈的大小
- 而栈是向上增长,所以它的大小受限于计算机的虚拟内存空间大小(硬限制)
能否产生碎片不同
- 堆:频繁地进行new和delete会导致内存空间不连续,从而产生大量的内存碎片,使程序的效率降低
- 栈:是先入后出的队列,要释放一片内存,必须得先把它后面(后进)的内存释放掉,所以不存在内存不连续的情况,自然也就不会产生内存碎片
分配方式不同
- 堆只能是是动态分配,由用户自行申请空间分配
- 栈可以是动态分配,也可以是静态分配。静态分配是由编译器完成,比如局部变量的申请;动态分配由函数alloca实现,它的释放是由编译器进行释放,无需手动释放。
分配效率不同
- 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这决定了栈的分配效率高
- 堆是由C/C++库提供的,机制很复杂,所以分配效率比栈低很多