GGURUPiOS
[Swift] Copy-on-Write과 메모리할당 본문
안녕하세요.
이번 시간에는 Copy-on-Write 가 무엇인지 알아보도록 하겠습니다.
Copy-on-Write(CoW)란 무엇일까?
컴퓨터 프로그래밍에서 수정 가능한 리소스에 대한 '복제' 또는 '복사' 작업을 효율적으로 구현하는 데 사용되는 리소스 관리 기법입니다.
이렇게 말하면 와닿지 않는데, 간단히 이야기하면
값이 변경 되기 전까지는 copy를 하지 않고 원본을 바라보는 것 입니다.
아래의 예시를 볼게요.
Array값을 할당한 numberArrays의 값을 다시 copyArrays에 할당하게 되면 CoW가 사용된걸 보실 수 있습니다.
처음에는 같은 메모리주소를 바라보다가, numberArrays의 값이 변경되면, 다른 메모리 주소를 가집니다.
(copyArrays의 값을 수정해도 마찬가지, 먼저 수정된 변수가 메모리 주소가 바뀜)
왜 사용할까?
즉, 위에서도 말했지만 복사할 때 낭비되는 리소스를 줄이는 목적입니다.
만약 1000개의 값을 가지고 있는 배열이 있다고 가정하고, 그 값이 변경되지 않는다고 가정해봅시다.
그러면 관리 측면에서 배열을 복사하는 작업 보다는 원본 배열의 메모리 주소만 가지고 있으면 복사에 낭비되는 리소스가 없을것입니다.
약간 참조타입과 비슷해 보이죠?
그렇다면 Array는 힙영역에 저장되는걸까요? 스택영역에 저장되는걸까요?
결론을 둘다입니다.
우리는 기본적으로 이런 개념을 가지고 있습니다.
값 타입 -> 스택 영역
참조 타입 -> 힙 영역
그런데 CoW가 사용된 Array는 구조체인데도 불구하고 힙 영역과 스택 영역 둘다에 저장됩니다.
즉, 상황에 따라서는 값 타입도 힙 영역에 저장될 수 있다는 것입니다.
일단 처음 할당될 때 힙 영역에 메모리 주소를 가지며,
스택영역에는 힙 영역의 메모리 주소만 저장되어 있습니다.
즉, 위에 했던 말들을 요약하자면
- CoW를 사용하면 값 타입을 참조 타입처럼 복사할 때 참조할 수 있다.
- 실제 복사는 해당 복사본을 수정하려고 할 때만 발생한다.(수정 작업시, 새로운 힙 영역 할당)
정도로 요약할 수 있습니다.
저는 Array만을 가지고 설명했지만
사실 String, Set, Array, Dictionary 등 CoW가 사용되고 있습니다.
아래의 링크 출처들에서 더 자세히 기술되어 있습니다.
내가 만든 구조체에서 CoW 사용하기
스위프트 docs에 따르면, 큰 값을 복사하는데 드는 비용을 없애려면 cow를 사용하라고 조언한다.
final class Ref<T> {
var val: T
init(_ v: T) { val = v }
}
struct Box<T> {
var ref: Ref<T>
init(_ x: T) { ref = Ref(x) }
var value: T {
get { return ref.val }
set {
if !isKnownUniquelyReferenced(&ref) {
ref = Ref(newValue)
return
}
ref.val = newValue
}
}
}
위와 같이 구현할 수 있다. isKnownUniquelyReferenced(object: &T) 메소드를 이용해
유일하게 참조되고 있는지 여부를 파악하고 값을 할당한다.
더 자세한 내용은 아래 링크에서 확인할 수 있다.
참고
https://www.vadimbulavin.com/value-types-and-reference-types-in-swift/
https://medium.com/@marthin.pasaribu_72336/copy-on-write-cow-with-swift-ce6c6583de38
'Swift > 문법 파헤치기' 카테고리의 다른 글
[Swift] Optional 이란 무엇일까? (0) | 2023.11.01 |
---|---|
[Swift] AnyObject, AnyClass, Any 에 대해 알아보기 (0) | 2023.11.01 |
[Swift] Designated Initailizers & Convenience Initializers (1) | 2023.10.31 |
[Swift] Dynamic Dispatch를 줄여 Class의 성능 향상시키기 (2) | 2023.10.30 |
[Swift] Struct vs Class vs Enum 공통점과 차이점 (0) | 2023.10.30 |