zoukankan      html  css  js  c++  java
  • 堆和栈的区别

    1:分配方式和回收方式

      栈得分配方式有两种,分别是静态分配和动态分配,无论是哪一种方式,栈空间的回收都是由操作系统处理的。即程序员不需要对栈空间进行处理,操作系统会帮助我们回收栈空间。

      堆得分配方式只有动态分配。堆中分配的空间,需要程序员自己去释放。如果没有释放,会造成内存泄露。

    2:大小以及结构

      栈在计算机中是一段连续的空间,既然是连续空间,其空间大小必然不会太大。通常情况下,栈的空间是2M。倘若程序所占用的栈空间超过2M,就会发生栈溢出的错误。比如,太深层次的递归就容易造成栈溢出。

      堆在计算机中的存储方式类似于链表,不是一段连续的空间。实际上,堆是将多个空闲的空间用链表连接在一起。因此,堆得大小是不确定的,而且,堆得空间要比栈大很多。当需要使用堆中的空间时,堆会从链表头开始查找,直至查找到某一个空闲块的空间是大于等于所需要的空间,然后将该空闲块分配。倘若有剩下的空间,剩下的空间会作为一个单独的空间块,并且由链表连接起来。

    3:碎片问题

      根据第二个不同点,很容易知道在使用堆时是有空间碎片的。而栈不存在这个问题,因为栈是直接分配的,倘若需要的空间大于剩余的栈空间,直接报栈溢出的错误;否则直接分配相应的空间。

    4:哪些在栈中,哪些在堆中

      基本变量,如 int 、char、string、float 等变量分配内存时,使用的都是栈中的空间。

      对象,比如OC中的 [[class alloc] init]、 C++ 中new 、C语言中的 malloc 出的对象时,使用的都是堆中的空间。

  • 相关阅读:
    [状压dp][spfa] Jzoj P3737 挖宝藏
    [计算几何] Jzoj P3736 数学题
    [排序][vector] Jzoj P6288 旋转子段
    [区间dp] Jzoj P6287 扭动的树
    [bfs][spfa] Jzoj P6286 走格子
    [点分治] Luogu P2664 树上游戏
    [树链剖分][树状数组] Luogu P3676 小清新数据结构题
    [计算几何][dp] Luogu P1995 智能车比赛
    [后缀数组][并查集] Luogu P2178 品酒大会
    [莫比乌斯反演][整除分块] Bzoj P2301 Problem b
  • 原文地址:https://www.cnblogs.com/acBool/p/5107553.html
Copyright © 2011-2022 走看看