• Swift 栈和堆


    前言

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

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

    1、栈

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

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

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

    2、堆

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

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

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

  • 相关阅读:
    Android OpenGL 编写简单滤镜
    linux 文件系统
    此博客不再更新
    golang sync包
    KADEMLIA算法
    golang 类型转换
    golang 小例子
    go-ehtereum编译:
    golang编译库文件方式
    以太坊(Ethereum)智能合约NodeJS/Web3 使用
  • 原文地址:https://www.cnblogs.com/QianChia/p/8861908.html
Copyright © 2020-2023  润新知