##iOS中堆和栈的区别
2019-02-24 本文已影响0人
枫叶无处漂泊
前言
在我们编程中,不可避免的使用堆和栈内存,它们是什么?有什么区别?下面我从几个方面来说明区别
使用内存的行为
- 创建一个对象
- 定义一个变量
- 调用一个函数和方法
一、管理方式
- 栈:
是由编译自动管理,无需我们手工释放内存 - 堆:
释放工作由程序员控制,容易产生内存泄漏。
二、申请地址大小
- 栈:
栈是向低地址扩展的数据结构,是一块连续的内存区域,从栈获得的空间较小,效率高。 - 堆:
堆是向高地址扩展的数据结构,是不连续的内存区域。,堆获得的空间比较灵活、比较大。
三、内存碎片问题
- 堆:
频繁的new/realease势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。 - 栈:
不会存在内存碎片问题,因为栈是先进后出的队列,他们是--对应,以至于永远都不可能有一个内存块从栈中间弹出。
四、分配方式问题
- 堆:
堆是动态分配的,没有静态分配的堆。 - 栈:
有两种分配方式:静态分配和动态分配.- 静态分配:
是编译器完成的,比如局部变量的分配. - 动态分配:
由alloc函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现.
- 静态分配:
五、分配效率
- 栈:机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
- 堆:
堆则是c/c++函数提供的,他的机制很复杂。效率相对低。
总结
申请栈的内存百分百回收,堆内存不一定百分百回收,容易出现内存碎片。