Copy On Write
종류: Swift
COW(Copy on write)
- 값 타입에서의 최적화 기법
- 인스턴스를 복사할 때에는 참조를 해서 불필요한 복사를 줄이고 수정이 발생될 때만 값 복사를 하는 방식
- Collection타입에 기본적으로 COW가 구현되어 있음
var array1: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(UnsafeRawPointer(array1)) // 0x0000000100704210
var array2 = array1
print(UnsafeRawPointer(array2)) // 0x0000000100704210 주소 동일
array2.removeLast() // Copy-on-Write
print(UnsafeRawPointer(array1)) // 0x0000000100704210
print(UnsafeRawPointer(array2)) // 0x0000000100404e70 주소 달라짐
COW 직접 구현해보기
struct User {
var name: String
var age: Int
}
class DataWrapper { // COW의 핵심적인 역할, reference로 복사하게 도와줌
var data: T
init(data: T) {
self.data = data
}
}
struct COWUser {
private var dataWrapper: DataWrapper
init(data: T) {
self.dataWrapper = DataWrapper(data: data)
}
var data: T {
get {
return self.dataWrapper.data
}
set {
// dataWrapper의 참조가 유일한지 체크해서 유일하면 기존 인스턴스에 데이터를 할당하고 아니면 새로 생성
guard isKnownUniquelyReferenced(&dataWrapper) else {
dataWrapper = DataWrapper(data: newValue)
return
}
dataWrapper.data = newValue
}
}
}
참고