Swift 栈和堆
Posted qianchia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift 栈和堆相关的知识,希望对你有一定的参考价值。
前言
Swift 中的数据类型分为引用类型(类)和值类型(枚举、结构体)。
- 引用类型存储在 “堆” 上,值类型存储在 “栈” 上。
- Swift 管理引用类型采用自动引用计数(ARC)的管理方法。
- 值类型是由处理器来管理的,不需要程序员来管理。
1、栈
栈是一块空间较小,但是运行速度很快的内存区域。
- 栈上的内存分配遵循后进先出的原则,通过移动栈的尾指针实现 push(入栈)和 pop(出栈)操作。
我们的程序是由一个个方法组成的,CPU 会负责调度并执行这些方法。
- 当我们的程序执行到某个方法的时候,需要在栈上为方法需要的内存开辟空间,此时把栈的尾指针向栈底移动。
- 当方法执行完毕后需要释放掉这些空间,此时会把栈的尾指针移向栈顶,这就完成了一次栈上的内存分配。
2、堆
堆是内存中的另一块区域,空间比栈大的多,但是运行速度要比栈上的运行速度慢。
- 堆可以在运行时动态的分配内存,补充栈上内存分配的不足。
堆的内存分配原则比较复杂,不会像栈上那样在方法调用结束时立即回收,系统需要在栈上不断的寻找不再需要的内存,然后进行回收。
- 堆上内存寻找的过程是自动的,使用了名为 ARC(自动引用计数)的技术。
在多线程环境中,多个线程会共享堆上的内存,为了确保线程安全,不得不在堆上进行加锁操作,但是加锁操作是很耗费性能的,你在堆上所获的的数据安全性实际上是在牺牲性能的代价下得来的。
以上是关于Swift 栈和堆的主要内容,如果未能解决你的问题,请参考以下文章