COW 동작 방식

Jee.e (황지희)·2022년 3월 2일
1

COW ?

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 은 메모리를 할당받고, array2array1의 주소를 갖고있다.

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

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글