1.管理方式不同。操作系统负责管理栈空间的分配和释放,无需程序员手动控制;堆空间的申请和释放由程序员控制,容易产生内存泄漏。
2.空间大小不同。每个进程拥有的栈空间的大小要远远小于堆空间的大小。理论上,程序员可申请的堆空间大小为虚拟内存的大小,而进程所拥有的栈空间的大小在64位的Windows系统上默认为1MB,在64位的Linux系统上默认为10MB。
3.生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
4.分配方式不同。堆是动态分配的,而栈有两种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,而动态分配由alloca函数进行。alloca函数在栈上为变量申请空间,但该变量离开其作用域之后其占用空间会被自动释放,无需程序员手动释放。
5.分配效率不同。栈空间由操作系统自动分配,存在专门的硬件为栈提供支持,例如栈顶寄存器(sp),专门的出栈指令(pop)和压栈指令(push)等,这就决定了栈的工作效率比较高;堆通过C/C++提供的库函数或运算符来完成内存空间的申请与管理,此外,频繁的内存申请容易产生内存碎片并且容易发生内存泄露。显然,堆的效率比栈要低得多。
6.存放内容不同。栈存放的内容包括函数返回地址、参数、局部变量和某些寄存器内容等,而堆存放的内容由程序员决定。
原文:https://www.cnblogs.com/ccpeng/p/14774035.html