首页 > 系统服务 > 详细

进程视角下堆与栈的区别

时间:2021-05-16 19:19:03      阅读:31      评论:0      收藏:0      [点我收藏+]

进程视角下堆与栈的区别

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!