THIS IS ELLIE

스위프트 배열 크기 본문

개발/Swift

스위프트 배열 크기

Ellie Kim 2020. 11. 9. 01:31

어떤 분이 초기화되지 않은 버퍼에 액세스 할 수 있는 배열 초기화 프로그램을 만든 포스트를 보다가 작성하게 되었어요.

forums.swift.org/t/array-initializer-with-access-to-uninitialized-buffer/13689

 

스위프트에서 배열 크기 늘리기

// Grwoing the size an array

 

 

스위프트에서 배열은 내용을 보관하기 위해 특정 사이즈만큼의 메모리를 예약해둡니다.

배열에 element를 추가하고 해당 배열이 예약된 용량을 초과하기 시작하면,

배열은 더 큰 메모리 영역을 할당하고 해당 element를 새 저장 공간에 복사합니다.

 

이때 새 저장소의 크기는 이전 저장소 크기의 배수입니다.

이렇게 배수로 증가시키는 것은 상수 시간으로 element가 추가되는 것과 추가적인 많은 연산들의 성능을 평균화한다는 것을 의미합니다.

재할당을 하는 작업은 성능 비용이 발생하지만, 배열이 증가될수록 트리거 발생 빈도가 점점 줄어듭니다.

 

만약 저장해야 하는 element 수를 대략 알고 있으면,

재 할당을 방지하기 위해 배열에 element를 추가하는 작업 전 reserveCapacity라는 메서드를 사용하면 됩니다.

이는 더 큰 저장소를 할당하지 않고 배열에 저장할 수 있는 element의 수를 결정할 수 있습니다.

 

대부분의 Element타입 배열에서 저장 공간은 연속적인 메모리 블록입니다.

Element타입의 배열이 클래스 또는 @objc프로토콜 타입의 배열인 경우,

저장 공간은 연속적인 메모리 블록이 될 수도 있고 NSArray의 인스턴스 일수도 있습니다.

임의의 NSArray의 하위 클래스가 Array가 될 수 있으므로 이 경우는 효율성을 보장할 수 없습니다.

 

(아래는 참고할만한 예시)

var numbers = [10, 20, 30, 40, 50]
numbers.count == 5
numbers.capacity == 5

numbers.append(contentsOf: stride(from: 60, through: 100, by: 10))
numbers.count == 10
numbers.capacity == 12

 

ps

배열의 저장 공간을 배수로 증가시키는 것이 효율적인 걸까

효율을 위해서 reserveCapacity가 있겠지만 저장해야 하는 element의 수를 내가 모른다면 또 이야기는 달라지지 않을까 🤷‍♀️

 

resource:

developer.apple.com/documentation/swift/array

developer.apple.com/documentation/swift/array/1538966-reservecapacity

반응형

'개발 > Swift' 카테고리의 다른 글

스위프트 Intersperse함수  (0) 2021.05.30
스위프트 mutating 키워드  (0) 2020.11.12
스위프트 오버플로우 연산  (0) 2020.09.20
스위프트 비트 연산자  (0) 2020.09.18
dropFirst(_:), removeFirst(_:) 살펴보기  (1) 2020.09.16