COW는 Copy-On-Write로, Swift를 포함한 모든 프로그래밍에서 쓰이는 기술 중 하나이다.
- 수정이 이루어질 때, 복사한다.
- 참조를 통해 불필요한 복사를 줄여, 메모리를 절약한다.
- Swift에서는 Collection Type과 원시타입 구조체(Int, Double, String)에 구현되어있다.
- 사용자 정의 구조체에서 사용하고 싶다면 직접 구현해야한다.
var array1 = [1, 2, 3, 4, 5]
위와 같은 배열이 있다고 하자, 메모리에는 array1
이 올라간다.
var array1 = [1, 2, 3, 4, 5]
var array2 = array1
위와 같이, array2
를 생성해보자.
이때, 메모리 상황은 아래와 같다.
Array는 값 타입인데, 복사가 아닌 참조가 일어나는 이유?
➡️ 컬렉션이나 원시타입은 많은 양의 데이터를 갖게된다.
매 번 많은 양의 데이터를 복사한다면, 시간도 많이들고 메모리의 공간 부담도 커지게 된다.
성능을 높이고 시간을 절약하고자, Swift의 컴파일러가COW
를 사용한다.
아래와 같이 값을 변경했을 때, 복사가 이루어지는 것이다.
array1[0] = 2
메모리를 확인하면 더 확실하게 알 수 있다.
아래와 같이 선언
만 했을때는 주소값 또한 똑같다.
array1
은 메모리를 할당받고, array2
는 array1
의 주소를 갖고있다.
array1[0] = 2
로 값을 변경하고 난 후
에 아래와 같이 메모리를 할당받게 되어 주소가 달라지는 것이다.
✅ 주소 구하는 함수
func address(o1: UnsafeRawPointer) {
let address = String(format: "%p", Int(bitPattern: o1))
print(address)
}
func address<T: AnyObject>(o2: UnsafePointer<T>) {
let address = String(format: "%p", Int(bitPattern: o2))
print(o2.pointee)
print(address)
withUnsafePointer(to: T.self) { pointer in
pointer.pointee
pointer
}
}
참고 문서
1. https://babbab2.tistory.com/18
2. https://nsios.tistory.com/56