Swift 写时复制机制 以及值类型与引用类型思考


记录Swift语言特性–偶遇操作系统Copy on Write
今天在学习操作系统fork函数的时候遇到了写时复制,联想起了Swift中也有一个写时复制机制。

Swift 写时复制

var a = [1,2,3,4]
var b = a

当代码这样执行完的时候,数组a和数组b在内存上是同一块内容,也就是b目前还没有开辟新的内存,当 添加一条b.append(5) 并执行完之后,b和a在内存上就不是同一块内存了,系统给b新开辟了一块内存。即当b被复制但是还没有改变的时候,这时是没有发生新的内存开辟。

值类型与引用类型思考

Swift的类型分为两种:一种是值类型(如:Int类型),一种是引用类型(如:class类型),值类型在传递和赋值的时候是进行复制的,而引用类型则只会用一个指针指向这个对象,也就是内存中只存在一份。

值类型:

Swift语言在设计时,将struct、enum、String、Array这些类型都被设计成了值类型。这样做有什么好处?
一、线程安全:当新的线程对值类型进行访问的时候回copy出一份新的值,使用当线程会copy值类型内容时是线程安全的。
二、高效:在栈区进行操作相比于在堆区操作,更快速高效。
值类型在复制的时候也会产生额外的开销,但是Swift把这个开销控制在了最小范围内,也就是在没必要复制的时候,值类型不会进行复制。

引用类型:

引用类型,即所有实例都共享一份数据。
在Swift中,除了class是引用类型,还有闭包也是引用类型。引用类型的复制是进行的浅拷贝,也就是复制了一份指向改对象的指针。指向一个对象的指针,其中任何一个对其内部数据改变的时候,其他对象的数据也会受到影响。

如果将引用类型声明为常量,意味着这个常量不能被同类型变量赋值修改,然而可以修改该常量指向的内存中的变量。


文章作者: Cone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 Cone !
  目录