• 堆和栈的区别


    1:分配方式和回收方式

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

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

    2:大小以及结构

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

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

    3:碎片问题

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

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

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

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

  • 相关阅读:
    091115 T UI生成的类
    090717 T OOD时的接口
    090713 T 数组不OO
    090723 T Code Generate 的思考
    091101 T IModel
    091018 CH 培训方法论总结
    090615 T 数据库范式
    写程序,逻辑优先!
    091117 T else if 的写法
    091015 CH 培训所想到的
  • 原文地址:https://www.cnblogs.com/acBool/p/5107553.html
Copyright © 2020-2023  润新知