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

    1:分配方式和回收方式

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

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

    2:大小以及结构

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

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

    3:碎片问题

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

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

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

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

  • 相关阅读:
    前端主页
    配置站点
    前台
    数据库配置
    后台:Django项目创建
    虚拟环境的搭建
    pip安装源
    AngularJS Scope(作用域)
    scala中的匿名函数 ==> 简单示例
    scala中的内部类 ==> 简单示例
  • 原文地址:https://www.cnblogs.com/acBool/p/5107553.html
Copyright © 2011-2022 走看看