Swift 中的 Copy-on-Write

Swift 官方文档在介绍 Collection Types 时,详细解释了 Copy-on-Write 机制

Swift’s Array, Dictionary, and Set types are implemented as value types. The implementation of these types uses a technique called copy-on-write to ensure that copying is efficient. When you make a copy of a collection, the copy does not immediately create new storage and copy all of the elements. Instead, both copies share the same storage, and the storage is physically copied only when one of the copies is modified. This behavior means that you get the efficiency of references when you need it, without the complexity of managing your own references.

Swift 中的 "Copy-on-Write"(COW)机制是一种优化技术,用于提高值类型(如 Array、Dictionary、Set 等)的性能和内存使用效率。通过这种机制,Swift 可以在多个实例共享同一份数据副本的情况下,延迟实际的数据复制,直到副本被修改时才执行真正的拷贝操作。这样可以减少不必要的内存分配和数据复制,提高程序的效率。

下面是对 Swift 官方文档中 Copy-on-Write 机制的详细解释:

概述
在 Swift 中,值类型通常是按值传递的,这意味着在赋值或传递给函数时会创建副本。为了优化内存使用和性能,Swift 实现了 Copy-on-Write 机制。在这种机制下,值类型的实例仅在需要修改数据时才会真正复制数据。

工作原理
共享存储:当你复制一个值类型的实例时,新的实例和原始实例共享同一份存储。这是通过引用计数来管理的,引用计数记录了有多少实例共享同一份数据。

写时复制:当一个共享存储的实例被修改时,Swift 会检查引用计数。如果引用计数大于1(意味着有其他实例也在共享这份数据),则会进行真正的数据复制,确保修改不会影响到其他实例。这一步称为“写时复制”。

独占访问:如果实例在修改前的引用计数为1(意味着没有其他实例共享这份数据),则可以直接修改数据,无需进行复制。

例如:

import Foundation

var array1 = [1, 2, 3]
var array2 = array1 // array1 和 array2 共享同一份数据

// array1 和 array2 共享同一份存储
print(array1) // 输出 [1, 2, 3]
print(array2) // 输出 [1, 2, 3]

array1.append(4) // 修改 array1 时,进行写时复制
print(array1) // 输出 [1, 2, 3, 4]
print(array2) // 输出 [1, 2, 3]

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是Copy-On-Write(写时复制)? 我们将一个值类型分配给另一个值类型时,我们都有原始对象的副本: 如...
    sampson666888阅读 954评论 0 3
  • 在Swift中,如果你具有较大的值类型对象或数据并且必须将其作为参数分配或传递给一个函数,则在性能方面复制它代价可...
    小凉介阅读 8,783评论 2 30
  • 在Swift中,如果你具有较大的值类型对象或数据并且必须将其作为参数分配或传递给一个函数,则在性能方面复制它代价可...
    未来小文学家阅读 488评论 0 0
  • 一.堆栈 栈是一块空间较小但是运行速度很快的内存区域,栈上的内存分配遵循后进先出的原则,通过移动栈的尾指针实现pu...
    sidiWang阅读 1,209评论 0 0
  • 在您iOS生涯中很可能至少问过自己一次,struct和class之间有什么区别? 实际上,在使用一个或另一个之间的...
    韦弦Zhy阅读 646评论 0 4