美文网首页Swift学习
Swift的Copy-on-Write技术

Swift的Copy-on-Write技术

作者: X_L_F | 来源:发表于2019-09-27 20:21 被阅读0次

Copy-on-Write技术

Swift针对标准库中的集合类型(Array、Dictionary、Set)进行优化。当变量指向的内存空间并没有发生改变,进行拷贝时,只会进行浅拷贝。只有当值发生改变时才会进行深拷贝。

/**
*   读取变量指向地址
*/
func address(of object: UnsafeRawPointer) -> String {
    let addr = Int(bitPattern: object)
    return String(format: "%p", addr)
}

var array1 = [1, 2, 3, 4, 5, 6]
var array2 = array1
print(address(of: &array1))
print(address(of: &array2))
// 结果:
// 0x100527f60
// 0x100527f60

array1和array2都是指向地址是同一个空间,所以可以看出当前是浅拷贝

func address(of object: UnsafeRawPointer) -> String {
    let addr = Int(bitPattern: object)
    return String(format: "%p", addr)
}

var array1 = [1, 2, 3, 4, 5, 6]
var array2 = array1
array2[0] = 2           // 值发生了改变
print(address(of: &array1))
print(address(of: &array2))
// 结果:
// 0x100593ec0
// 0x102800230

array1和array2指向了不同的空间,所以可以看出当前是浅拷贝

Copy-on-Write技术的实现

用set来进行讲解

final class Ref<T> {
  var val: T
  init(_ v: T) {val = v}
}

struct Box<T> {
  var ref: Ref<T>
  init(_ x: T) {ref = Ref(x)}
  var value: T {
    get { return ref.val }  // 读取操作
    set {           // 修改操作
      if (!isUniquelyReferencedNonObjC(&ref)) { // 判断当前的类型值是否唯一的引用(即引用计算器为1)
        ref = Ref(newValue)     // 如果不是唯一的引用,则生成一个新的类型值并返回
        return
      }
      ref.val = newValue    // 如果是唯一的引用,则直接用当前的类型值进行修改
    }
  }
}

Array、Dictinary、Set每次进行修改前,都会通过类似isUniquelyReferencedNonObjC进行判断,判断是否是唯一的引用(即引用计数器为1)。若不为1,则创建新的类型值并返回。若是唯一的则直接赋值。

注意点

当Array、Dictionary、Set并没有进行修改操作值,建议把变量设置为let

参考:
https://swift.gg/2018/12/06/friday-qa-2015-04-17-lets-build-swiftarray/
https://juejin.im/post/5cbd31225188250a6e7e5d35

相关文章

  • Swift的Copy-on-Write技术

    Copy-on-Write技术 Swift针对标准库中的集合类型(Array、Dictionary、Set)进行优...

  • swift 结构体copy-on-write技术

    在Swift中,如果你具有较大的值类型对象或数据并且必须将其作为参数分配或传递给一个函数,则在性能方面复制它代价可...

  • Swift Copy-On-Write

    一.堆栈 栈是一块空间较小但是运行速度很快的内存区域,栈上的内存分配遵循后进先出的原则,通过移动栈的尾指针实现pu...

  • Swift - 学习

    1.类和结构体的区别 Swift中结构体和类的比较 2.写时拷贝机制 Swift Copy-On-Write 写时...

  • Swift5 写入时复制 copy-on-write

    swift的数组是值类型,值类型的一个特点是在传递和赋值时进行复制。swift使用了copy-on-write来避...

  • linux写时拷贝

    转载于Copy-On-Write COW 技术简介_Kuzury-CSDN博客[https://blog.csdn...

  • 几种Java同步List对比

    CopyOnWrite容器 基本思想 Copy-On-Write,写入时复制,这个技术,准确的说应该是一种思想,在...

  • Swift写时复制(copy-on-write)

    在Swift中,如果你具有较大的值类型对象或数据并且必须将其作为参数分配或传递给一个函数,则在性能方面复制它代价可...

  • Swift 值类型使用Copy-On-Write

    什么是Copy-On-Write(写时复制)? 我们将一个值类型分配给另一个值类型时,我们都有原始对象的副本: 如...

  • java容器——CopyOnWriteArrayList/Set

    夯实基础系列:基础是否扎实,决定你是否能走的更稳更远。 Copy-On-Write Copy-On-Write(C...

网友评论

    本文标题:Swift的Copy-on-Write技术

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