Swift 栈和堆

前言

  • Swift 中的数据类型分为引用类型(类)和值类型(枚举、结构体)。

    • 引用类型存储在 “堆” 上,值类型存储在 “栈” 上。
    • Swift 管理引用类型采用自动引用计数(ARC)的管理方法。
    • 值类型是由处理器来管理的,不需要程序员来管理。

1、栈

  • 栈是一块空间较小,但是运行速度很快的内存区域。

    • 栈上的内存分配遵循后进先出的原则,通过移动栈的尾指针实现 push(入栈)和 pop(出栈)操作。
  • 我们的程序是由一个个方法组成的,CPU 会负责调度并执行这些方法。

    • 当我们的程序执行到某个方法的时候,需要在栈上为方法需要的内存开辟空间,此时把栈的尾指针向栈底移动。
    • 当方法执行完毕后需要释放掉这些空间,此时会把栈的尾指针移向栈顶,这就完成了一次栈上的内存分配。

2、堆

  • 堆是内存中的另一块区域,空间比栈大的多,但是运行速度要比栈上的运行速度慢。

    • 堆可以在运行时动态的分配内存,补充栈上内存分配的不足。
  • 堆的内存分配原则比较复杂,不会像栈上那样在方法调用结束时立即回收,系统需要在栈上不断的寻找不再需要的内存,然后进行回收。

    • 堆上内存寻找的过程是自动的,使用了名为 ARC(自动引用计数)的技术。
  • 在多线程环境中,多个线程会共享堆上的内存,为了确保线程安全,不得不在堆上进行加锁操作,但是加锁操作是很耗费性能的,你在堆上所获的的数据安全性实际上是在牺牲性能的代价下得来的。

文章目录
  1. 1. 前言
  2. 2. 1、栈
  3. 3. 2、堆
隐藏目录