WWDC 2025: inLineArray, Span

틀틀보·2025년 6월 13일

WWDC2025

목록 보기
1/3

기존의 배열(Array)


기존의 배열은 동적 배열로 배열은 힙에 저장된 값들을 가리킨다.


기존에 시스템이 임의로 배열에 설정한 용량에 도달하면 동적으로 새 메모리를 할당하고 기존 요소들을 복사해야 하는 일련의 과정이 발생하여 성능 저하가 발생한다.

정적 배열의 등장 (inLine Array)

기존 let array: Array<Int> = []로 동적 배열만 설정할 수 있던 문제를 해결


InlineArray 생성자를 통한 정적 배열 생성

정적 배열이기 때문에 heap 할당이 필요없어졌으므로 stack에 저장됨.


복사된 배열 또한 stack에 저장

  • 정적 배열의 크기 및 내부 값 추론 가능
  • CoW 되지 않고 즉시 복사

Span

비소유(non-owning) 뷰로, Array, Data 등 소유한 컨테이너의 메모리를 벗어나지 않는 범위에서 참조

  • 낮은 오버헤드로 메모리를 복사 없이 접근 가능
  • 복사 없이 슬라이스(slice) 가능

Span 없이 구현

func getPointerToBytes() -> UnsafePointer<UInt8> {
    let array: [UInt8] = Array(repeating: 0, count: 128)
    // DANGER: The next line escapes a pointer
    let pointer = array.withUnsafeBufferPointer { $0.baseAddress! }
    // DANGER: The next line returns the escaped pointer
    return pointer
}
  • 문제 1: 함수 내에서 선언한 배열을 가리키는 배열의 return
  • 문제 2: 메모리 해제된 포인터가 return 되어 해당 주소에 잔여 참조 발생 (dangling pointer)

Span 사용

// Safe usage of a span
@available(macOS 16.0, *)
func processUsingSpan(_ array: [Int]) -> Int {
    let intSpan = array.span
    var result = 0
    for i in 0..<intSpan.count {
        result += calculate(using: intSpan, at: i)
    }
    return result
}
  • Array, ArraySlice, InlineArray 타입 등 여러 타입 내에 span 타입 지원
  • let intSpan = array.span 으로 복사 없이 메모리 참조
  • Span이 접근 할 수 있는 메모리는 메서드 탈출 전까지 수명 보장
  • Nonescapable로 컴파일러가 탈출을 방지 (경고)

참고
https://developer.apple.com/videos/play/wwdc2025/245/?time=1571

https://developer.apple.com/videos/play/wwdc2025/312/?time=1152

https://developer.apple.com/documentation/swift/span?changes=la

profile
안녕하세요! iOS 개발자입니다!

0개의 댓글