• 首页
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案
目录

堆和栈的区别

堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式。其区别主要有五大点,分别为申请过程不同,申请大小限制不同,申请效率不同,以及存放堆数据不同。

一、什么是堆内存?

堆是在程序运行时申请的内存空间,即动态分配的内存。对堆内存访问和对一般内存的访问没有区别。一般由用户申请和释放,若用户没有释放,程序结束时可能由操作系统回收。

二、什么是栈内存?

栈内存是为线程留出的临时空间,每个线程都有一个固定大小的栈空间,而且栈空间存储的数据只能由当前线程访问,所以它是线程安全的。栈内存由操作系统自动分配和释放,存放函数的形参、局部变量等,其操作方式类似于数据结构中的栈(先进后出)。

三、堆和栈的区别

1、申请过程

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找名列前茅个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的 free 语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放回空闲链表中。

2、申请大小的限制

栈空间容量有限,不同的操作系统有2M、4M、8M。

堆空间因为是不连续的内存,所以空间非常大,取决于虚拟内存的大小。

3、申请的效率

栈空间由系统管理,申请速度很快。

堆空间过程繁琐,使用起来比较慢。

4、存放的数据不同

栈空间存放函数形参和局部变量,并且形参按照从右到左的顺序依次进入栈内存,最后是局部变量。

堆内存的内容由程序员自己决定。

以上就是关于堆和栈堆知识希望对大家有帮助。

相关文章