Swift의 Reference vs Value Types 메모리 저장 위치

박성민·2022년 8월 15일
0

iOS

목록 보기
27/30
post-custom-banner

Swift Types

Swift의 Type은 Named, Compound type와 Reference, Value type을 기준으로 나눌 수 있습니다.

Named vs Compound

  • Named Type: class, struct, enum
  • Compound Type: tuple, function

더 자세한 내용을 알고 싶은 분들은 Swift Types를 보시면 도움이 될 것 같습니다.

Reference vs Value

Reference Type

  • class, func, closure
  • call by reference:parameter 전달 시 객체를 가리키고 있는 메모리 주소값이 복사됩니다.
  • 런타임에 직접 allocate하며 reference counting을 통해 deallocate가 필요
  • memory fragmentation등의 overhead가 존재합니다.
  • Heap memory 영역에 할당 (속도가 느림). Stack에 저장되는 경우가 있습니다!.

Value Type

  • struct, enum, tuple 및 swift 기본 자료형(Int, Float, String, Array, Dictionary, Set 등은 모두 struct로 구현되어 있음)
  • call by value: parameter 전달 시 value copy가 일어납니다.
  • multi-thread 환경에서 공유 변수로 인한 문제를 일으킬 확률이 적다.
  • scope based lifetime: comfile timecompiler가 언제 메모리를 할당/해제할지 정확히 알고 있다.
  • Stack memory 영역에 할당 (속도가 빠름). heap 저장되는 경우가 있습니다!

메모리 할당 공간

기본적으로 value type은 stack 영역에 저장되고 reference type은 heap 영역에 저장됩니다. 하지만 특정 경우에는 value type임에도 heap영역에 저장되고 reference type임에도 stack 영역에 저장되는 경우가 있습니다.

1. Heap에 저장되는 Value Type

Array, Dictionary, Set, String(collection of characters) 등

  • 가변 길이 Collection의 경우 일반적으로 내부 데이터를 Heap 에 저장해서 사용합니다. 컴파일 타임에 사이즈를 정확히 알기 어렵기 때문에 Heap에 할당 후, 적절히 데이터 / 사이즈를 증감시킵니다.
  • Swift에서 value type들은 매번 새로운 공간을 할당하고 복사하는 것은 부담이 되기 때문에, 수정(write)이 발생할 때 할장하는 Copy on Write를 사용합니다. 수정 전까지는 기존 element가 저장된 메모리 주소를 참조합니다.

기타

protocol 을 채택 할 때, generic을 사용할 때 등 다양한 상황들 (참고)

2. Stack에 저장되는 Reference Type

Reference Type의 사이즈가 고정되어있거나, 라이프타임을 예측할 수 있을 때

  • 스위프트 컴파일러는 Reference typeStack에 할당할 수도 있다고 합니다. 이러한 최적화는 SIL 생성 구간에서 발생합니다.(참고)
  • 예를 들어 오버라이딩한 메서드는 실행 시점에 어떤 메서드를 실행할지 결정하는 반면, final 키워드가 적용된 메서드는 컴파일 시점에 어떤 메서드를 실행할지 결정할 수 있으므로 Stack에 할당할 수도 있습니다.

출처

profile
iOS시작~
post-custom-banner

0개의 댓글