堆和栈的区别

堆和栈的区别转:https://my.oschina.net/aofe/blog/267882堆和栈的区别:·1>堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。需要程序员自

大家好,又见面了,我是你们的朋友全栈君。

转:https://my.oschina.net/aofe/blog/267882

堆和栈的区别:

·      1> 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。需要程序员自己申请并且指明大小,如C语言的malloc函数。

·      2> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存。例如声明函数中的一个局部变量int b,系统在栈中自动为b开辟空间。

接下来我将从以下几个方面来阐述堆与栈的区别;

    管理方式:

        对于栈来讲,由编译器自动管理,无需我们手动控制。

        对于堆来说,释放工作由程序员控制,容易产生memory warning。

    申请大小:

        栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域.即栈顶的地址和栈的最大容量是系统预先规好的。栈的大小是1M,如果申请空间超过栈的剩余空间时,将提示overflow.因此,能从栈获得的空间较小。

        堆:堆是向高地址扩展的数据结构,是不连续的内存区域.这是因为系统是用链表来存储空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址.堆得大小受限于计算机系统中有效地虚拟内存.由此可见,堆获得的空间比较灵活,也比较大。

    碎片问题:

        对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。

        对于栈来讲,则不会存在这个问题,因为栈是先进后出得队列,它们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出。

    分配方式:

        堆都是动态分配的,没有静态分配的堆。

        栈有两种分配方式:静态分配和动态分配.静态分配是编译器完成的,比如局部变量的分配.动态分配由alloc函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无需我们手工实现。

    分配效率:

        栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

        堆则是C/C++函数库提供的,它的机制是很复杂的。例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。 

 

为什么栈比堆快?

从两方面来考虑:
      1.分配和释放,堆在分配和释放时都要调用函数(MALLOC,FREE),比如分配时会到堆空间去寻找足够大小的空间(因为多次分配释放后会造成空洞),这些都会花费一定的时间,具体可以看看MALLOC和FREE的源代码,他们做了很多额外的工作,而栈却不需要这些。
      2.访问时间,访问堆的一个具体单元,需要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。另外,堆的内容被操作系统交换到外存的概率比栈大,栈一般是不会被交换出去的。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155155.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教程(一)官网下载Java JDK安装包「建议收藏」

    从今天开始我们一起来学习一Java程序设计。这个教程适合零基础的朋友学习,不适合高手。不当之处还请指教。下载Java最新的JDK安装包下载地址:https://www.oracle.com/java/technologies/javase-java-archive-javase6-downloads.html将页面滚动条拖到最底下找到“JavaArchive”点击“Download…

    2022年4月9日
    52
  • 【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)「建议收藏」

    【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)「建议收藏」摘要:案例数据源:有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。数据来自《SPSSforWindows统计分析》。目录问题一:选择那些变量进行聚类?——采用“R型聚类”问题二:20中啤酒能分为几类?——采用“Q型聚类”问题三:用于聚类的变量对聚类过程、结果又贡献么,有用么?——采用“单因素方差分析”问题四:聚类结果的解释?——采用”均值比较描述统计“问题一:选择那些变量进行聚类?——采用“R型聚类”1、现在我们…

    2022年10月18日
    5
  • eclipse 导入父子工程_eclipse 导入maven 父子项目

    eclipse 导入父子工程_eclipse 导入maven 父子项目你先要确认svn上是否是maven项目,否则要自己重新建一个maven项目然后直接引入目录了。如果确认是maven项目,那么有个两个方案。案一:先用任何client软件将svn下载。然后在eclipse选择import,然后当作existmavenproject导入。案二:在project中有checkoutmavenfromscm。scm就是指版本控制软件。不过不同版本控制的sc…

    2022年5月6日
    247
  • 几个汇编教程地址[通俗易懂]

    几个汇编教程地址[通俗易懂]汇编语言程序设计指南http://c.biancheng.net/asm/AssemblyLanguage教程https://www.w3cschool.cn/assembly/

    2022年6月21日
    37
  • docker部署web项目_小钢炮docker安装web

    docker部署web项目_小钢炮docker安装web前言前面我们运行的容器并没有一些什么特别的用处。接下来让我们尝试使用docker构建一个web应用程序。我们将在docker容器中运行一个PythonFlask应用来运行一个web

    2022年8月6日
    13
  • 【linux】路由route学习(二):route命令详解

    【linux】路由route学习(二):route命令详解1 命令行参数 Route 显示 操作 IP 路由表 Route 操作内核的 IP 路由表 它的主要用途是在使用 ifconfig 程序配置后 通过一个接口建立到特定主机或网络的静态路由 当使用 add 或 del 选项时 route 会修改路由表 如果没有这些选项 route 将显示路由表的当前内容 SYNOPSISrout CFvnee route v Afamily add net host target netmaskNm gwGw metricN mssM

    2025年9月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号