apple/iOS, UIKit, Documentation

[Swift] plain ol' data(POD)

lgvv 2023. 8. 8. 21:40

plain ol' data(POD)

 

👇 애플 문서에 나와있는 설명 <br>
[apple swift docs](https://github.com/apple/swift/blob/main/docs/ABIStabilityManifesto.md#type-properties)

 

 

- 어떤 데이터 타입은 단순히 데이터를 저장하고 추가적인 복사, 이동 또는 소멸 의미가 없습니다. 즉, trivial(혹은 POD)으로 알려진 이 데이터는 그들의 비트를 복제하는 것으로 copy할 수 있고, deallocation를 통해 소멸된다. 만약 모든 멤버의 타입이 trivial이라면 그것또한 또한 trivial 타입입니다.

 

- 어떤 타입이 비트 단위로 이동가능하다 라는 것은 그것의 주소에 의존하는 어떠한 사이드 테이블의 참조도 없을 때를 의미합니다. 객체가 한 위치에서 다른 위치로 복사되고 원래 위치가 더 이상 사용되지 않을 때 [move](https://doc.rust-lang.org/book/ownership.html#move-semantics) operation 이 발생할 수 있습니다. 비트 단위로 이동 가능한 객체는 비트 copy 작업을 수행한 다음 원래 위치를 무효화하여 이동합니다. 어떤 유형이 비트 단위로 이동 가능하다는 것은 그것의 모든 멤버의 타입이 비트단위로 이동 가능하다는 말입니다. 즉, 모든 trivial 타입들은 비트 단위로 이동 가능합니다.

 

struct Point { 
   var x: Double
   var y: Double
}

 

- trivial type 예시로는 두 개의 Double 필드(즉, x 좌표 및 y 좌표)를 포함하는 Point 구조체가 있습니다. 이 구조체는 단순히 비트를 복사함으로써 복사할 수 있으며, 파괴 시에는 추가 작업을 수행하지 않으므로 trivial 구조체입니다.

 

- non-trivial, 비트 단위로 이동 가능인 예시는 struct안에 class instance를 참조하는 객체입니다. 이 객체는 그들의 단순히 비트들 카피하는 것으로 복사할 수 없습니다. 참조(reference)에 대한 보유(retain) 작업이 수행되어야 하기 때문입니다. 파괴할 때에는 객체를 해제(release)하는 작업을 수행해야 합니다. 그러나 원래 위치를 무효화하면서 비트를 복사하여 객체를 한 주소에서 다른 주소로 이동시킬 수 있습니다. 이로써 전체적인 보유(retain) 수는 변경되지 않습니다.

 

- non-trivial 비트단위로 이동 가능한 weak reference가 있습니다. weak reference는 사이드 테이블에서 추적되며, 그래서 객체가 파괴될 때 해당 객체를 nil로 만들 수 있습니다. 이런 유형의 객체는 한 주소에서 다른 주소로 이동시킬 때 사이드 테이블을 업데이트하며 weak reference의 새로운 주소를 참조하도록 해야합니다.

 

POD, non-POD 분류


- POD
   - Int
   - Float

   - Double
   - Range< POD >
   - ClosedRange< POD >
   - Optional< POD >
- non-POD
   - String
   - Character
   - Array
   - Dictionary
   - Set
   - Error
   - Result
   - State
   - Binding
   - POD가 아닌 나머지 값 외 모든 참조 타입은 non-POD

 

POD, non-POD 타입 확인 방법

 

func _isPOD<T>(_ type: T.Type) -> Bool

C++ 설명 추가

  • Plain Old Data란 메모리 상에서 연속적인 바이트열. 원시적인 단순 복사 등 진보된 문법이 사실상 의미가 없을 때라면 해당 데이터 타입을 POD로 구분(혹은 취급)하여 하드웨어에서 좀 더 효율적으로 개체를 이동하거나 복사할 수 있음.
  • 간단한 기본 생성자 및 소멸자와 간단한 복사 및 연산을 갖고 있다. 즉, 비트 단위 연산이 가능해야 한다.

 

 

(참고)

- https://forums.swift.org/t/trying-to-understand-pod-plain-old-datatypes/49738/3

- https://github.com/apple/swift/blob/5a7b8c7922348179cc6dbc7281108e59d94ccecb/stdlib/public/core/Builtin.swift#L709

- https://github.com/apple/swift/blob/main/docs/ABIStabilityManifesto.md#type-properties

- https://en.wikipedia.org/wiki/Passive_data_structure

- https://velog.io/@doldamul/SwiftUI-Modifier-equatable

- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sorkelf&logNo=40132282389 

'apple > iOS, UIKit, Documentation' 카테고리의 다른 글

[iOS] CoreData 정리 2 실습 (2/2)  (0) 2023.12.10
[iOS] CoreData 정리 이론 (1/2)  (0) 2023.12.10
[UIKit] UILabel Inset  (0) 2023.06.23
[Swift] 커링(Currying)  (1) 2023.02.28
[iOS] UIImage.Orientation  (0) 2022.12.09