美文网首页
##iOS中堆和栈的区别

##iOS中堆和栈的区别

作者: 枫叶无处漂泊 | 来源:发表于2019-02-24 22:56 被阅读0次

    前言

    在我们编程中,不可避免的使用堆和栈内存,它们是什么?有什么区别?下面我从几个方面来说明区别

    使用内存的行为

    • 创建一个对象
    • 定义一个变量
    • 调用一个函数和方法

    一、管理方式

    • 栈:
      是由编译自动管理,无需我们手工释放内存
    • 堆:
      释放工作由程序员控制,容易产生内存泄漏。

    二、申请地址大小

    • 栈:
      栈是向低地址扩展的数据结构,是一块连续的内存区域,从栈获得的空间较小,效率高。
    • 堆:
      堆是向高地址扩展的数据结构,是不连续的内存区域。,堆获得的空间比较灵活、比较大。

    三、内存碎片问题

    • 堆:
      频繁的new/realease势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
    • 栈:
      不会存在内存碎片问题,因为栈是先进后出的队列,他们是--对应,以至于永远都不可能有一个内存块从栈中间弹出。

    四、分配方式问题

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

    五、分配效率

    • 栈:机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
    • 堆:
      堆则是c/c++函数提供的,他的机制很复杂。效率相对低。

    总结

    申请栈的内存百分百回收,堆内存不一定百分百回收,容易出现内存碎片。

    相关文章

      网友评论

          本文标题:##iOS中堆和栈的区别

          本文链接:https://www.haomeiwen.com/subject/dabmyqtx.html