技术

Swift-数组的写时复制机制

2023-03-15  本文已影响0人  萧修

基础:

浅复制:只是对指针的拷贝,拷贝后两个指针指向同一块内存空间。
深复制:不但对指针进行拷贝,二而且对指向的内容进行拷贝,经过深拷贝后的指针指向两个不同地址的地址

了解结构体和类的区别

主要区别:值类型和引用类型

Swift中的结构体

谈一下Swift中基本类型,证整数,浮点,字符串,数组,字典都是值类型。并且都是结构体的形式实现。
这些值类型在每次赋值传递都是会重新在内存拷贝一份吗?
Swift的copy on write只有当值需要改变时,才进行拷贝行为。

写时复制定义:

如果结构体的引用在被改变的一瞬间是唯一的话,那么就不会有复制产生,内存的改变在原地进行。如果不是那就先进行复制,对复制的值进行变化,不影响原来的值。

var arr = [1,3,5,6,2,4,7,6,2]
var arr1 = arr
print(arr[0])
arr[0] = 100
print(arr[0])
print(arr1[0])

//下面的打印
1
100
1

优点:允许复制数组和原数组共享同一块内存地址,直到某一个改变。内存改变更加高效。

查看arr和arr1的地址:

fr v -R arr1
(Swift.Array<Swift.Int>) arr1 = {
  _buffer = {
    _storage = {
      rawValue = 0x0000600002908000 {
        Swift.__ContiguousArrayStorageBase = {
          Swift.__SwiftNativeNSArrayWithContiguousStorage = {
            Swift.__SwiftNativeNSArray ={...}
          }
          countAndCapacity = {
            _storage ={...}
          }
        }
      }
    }
  }
}

fr v -R arr
(Swift.Array<Swift.Int>) arr = {
  _buffer = {
    _storage = {
      rawValue = 0x0000600002900000 {
        Swift.__ContiguousArrayStorageBase = {
          Swift.__SwiftNativeNSArrayWithContiguousStorage = {
            Swift.__SwiftNativeNSArray ={...}
          }
          countAndCapacity = {
            _storage ={...}
          }
        }
      }
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读