Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- tableView
- Observable
- UICollectionView
- UITextView
- 리펙터링
- Protocol
- 애니메이션
- Xcode
- 리펙토링
- rxswift
- Refactoring
- map
- collectionview
- SWIFT
- ribs
- clean architecture
- 스위프트
- combine
- uiscrollview
- uitableview
- ios
- swift documentation
- RxCocoa
- 리팩토링
- 클린 코드
- swiftUI
- HIG
- Human interface guide
- Clean Code
- MVVM
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] consume 연산자 (#메모리 최적화, 성능 최적화, move-only Types, Swift5.9) 본문
iOS 응용 (swift)
[iOS - swift] consume 연산자 (#메모리 최적화, 성능 최적화, move-only Types, Swift5.9)
jake-kim 2023. 8. 21. 01:02Move-only Types 개념
- 효율적으로 값을 인자에 넘겨서 메모리 관리 및 성능 상의 최적화를 하는 방법 (Swift5.9에서 이와 연관된 consume 연산자 탄생)
- 값을 복사하거나 참조를 넘기는 형태가 아닌, 값의 소유권을 이전한다고 표현
- 기존에는 특정 과업을 위해서 값을 업데이트 하고 사용한 후 초기화 해주는데, 이 방법은 메모리 관리상 비효율적인 방법
- 보통 3가지 방법이 존재
1) 배열에 직접 추가
var x = [Int]()
x.append(5)
x.use()
x = []
2) 함수의 인수에 값을 넘겨서 새로운 값을 업데이트하고난 후 반환된 값으로 다시 변경
x = appendFive(x)
x.use()
x = []
3) 함수에 reference를 넘겨서 inout 인수 업데이트 처리
// 3.
appendFive(with: &x)
x.use()
x = []
consume 연산자
- Swift5.9에서 적용
- 값의 소유권을 이전하여 값을 복사하거나 참조를 전달하는 방법을 사용하지 않도록 하는 성능 최적화 방법
ex) consume 키워드를 프로퍼티 앞에 사용하면, 해당 소유권을 이전하여 consume 키워드를 쓴 프로퍼티는 앞으로 사용 불가 (컴파일 에러)
// 코드: https://github.com/apple/swift-evolution/blob/main/proposals/0366-move-function.md
useX(x) // do some stuff with local variable x
// Ends lifetime of x, y's lifetime begins.
let y = consume x // [1]
useY(y) // do some stuff with local variable y
useX(x) // error, x's lifetime was ended at [1]
// Ends lifetime of y, destroying the current value.
_ = consume y // [2]
useX(x) // error, x's lifetime was ended at [1]
useY(y) // error, y's lifetime was ended at [2]
- 프로퍼티 뿐만이 아닌 함수의 파라미터에 consume 적용이 가능
- 파라미터에 consume이 있게되면 사용하는 쪽에서 이미 consume된 프로퍼티를 전달하려고 할때 컴파일 에러가 발생
func doStuffUniquely(with value: consume [Int]) {
// If we received the last remaining reference to `value`, we'd like
// to be able to efficiently update it without incurring more copies.
var newValue = consume value
newValue.append(42)
process(newValue)
}
func test() {
var x: [Int] = getArray()
x.append(5)
doStuffUniquely(with: consume x)
// ERROR: x used after being consumed
doStuffInvalidly(with: x)
x = []
doMoreStuff(with: &x)
}
* 참고
https://github.com/apple/swift-evolution/blob/main/proposals/0366-move-function.md
https://stackoverflow.com/questions/51292799/what-does-consuming-do-in-swift
https://github.com/apple/swift/blob/main/stdlib/public/core/Sequence.swift#L391
'iOS 응용 (swift)' 카테고리의 다른 글
Comments