[Swift] Arrays

Ben·2024년 6월 9일
0

iOS

목록 보기
14/23

Swift의 Array 타입의 인스턴스가 메모리 공간에서 어떻게 생성되는지 궁금하여 Stack Overflow에 직접 질문을 올려보았고, Array 코드를 파헤쳐 보았다.

👉 [Stack Overflow]: 'In which area of memory is an instance of 'Array', one of Swift's collection types stored?'


Components

var arr: Array<Int> = [1, 2, 3]

위와 같이 배열 리터럴 값을 할당하여 Array 인스턴스를 초기화하면, Array의 구현부와 ExpressibleByArrayLiteral 프로토콜의 메서드인 init(arrayLiteral:) 구현부에 의해 초기화가 된다.

즉, Array 구조체 인스턴스에 배열 리터럴 값인 elements가 저장되어진다.

이제 컴파일 시점에 Array의 조건부 컴파일에 의해 두 가지 방법중 하나를 선택하게 되는데,

할당되는 값이 배열 리터럴 값이므로 Array의 _buffer 프로퍼티는 ContiguousArrayBuffer<Element> 타입이 된다.

💡 Element가 '값 타입' 인 경우, Array<Element>의 성능은 ContiguousArray<Element>의 성능과 동일하다.

ContigousArrayBuffer<Element>storage 프로퍼티는 ContiguousArrayStorageBase 클래스 타입이므로, storage는 ContiguousArrayBuffer<Element>의 init(_ storage:) 메서드에서 초기화가 된다(?)


위의 일련의 과정을 거쳐 Array 인스턴스를 생성하면, ContiguousArrayStorageBase 클래스 타입의 storage에 의해 배열 요소를 비롯한 메타데이터가 heap 영역에 저장된다.

'The Swift Array Design - Components'에서 Array의 구성요소를 도식화한 그림이다.
바로 위에서 Array 인스턴스가 초기화 되는 과정과 비슷한 구성을 이루는 것 같다.

완벽하게 이해한 것은 아니나 참고하면 좋을만한 레퍼런스 링크를 남긴다.
(더 자세하게 알아보신 분들이 분명 계실 것이다.)

References)

profile
 iOS Developer

0개의 댓글