일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 모듈화
- swiftwasm
- uFeature
- SwiftLint
- Run Script
- Swift
- Dependencies.swift
- rethrows
- Modular Architecture
- wasm
- Tuist
- Publish
- XCConfig
- Tuist 모듈화
- Stencil
- SPM
- 아키텍쳐
- Architecture
- Swift Package Manager
- Module
- 메모리 구조
- Micro Feature
- Swift-Web
- Prod
- dependencies
- tuist 4
- SwifWeb
- 4.0.0
- ios
- Build Phase
Archives
- Today
- Total
baegteun - iOS
[iOS - Swift] Swift의 메모리 구조 본문
프로그램이 실행되면 OS가 메모리 공간을 할당해주는데 Code, Data, Heap, Stack 4개로 나뉜다.
Code
우리가 작성한 소스코드가 저장되는 영역이다.
- 소스코드를 기계어 형태 (0, 1) 로 변경하여 저장한다.
- 컴파일 타임에 결정되고, 중간에 코드가 변경되면 안되니 Read-Only로 저장된다.
Data
이름 그대로 데이터를 저장하는 영역이다.
- 전역 변수, static 변수가 저장된다.
enum Constant { static let apiKey = "" }
var name = "baegteun"
var number = 18
- 프로그램의 시작과 동시에 할당되고, 프로그램이 **종료되어야 해제**된다.
- 실행 도중 값이 변경될 수도 있으니 **Read-Write**로 저장된다.
# Heap
데이터 크기가 확실하지 않은 **가변적인 데이터 타입**들이 저장되는 영역이다.
- 4개의 영역중 유일하게 **런타임**에 결정된다.
- Heap영역에는 임의의 주소값에 해당 메모리를 할당한다.
- 임의의 값에 해당하기 때문에 주소를 찾아가는 것에 대한 오버헤드가 크다.
- 메모리 할당, 해제가 하나의 명령어로 처리되지 않기 때문에 관리가 어렵다.
- 메모리가 올라갔는지 아닌지 계속 추적하는 **Reference Counting**이 필요하다.
- **ARC**에 의해 Reference Counting이 관리된다.
- **스레드들이 공유**하는 영역이기 때문에 **thread-safety**하지 않다.
- 이를 관리하기 위해서는 Lock같은 자원이 필요하고 이것이 오버헤드로 이어진다.
class의 인스턴스, closure, 가변적인 String, Array같은 타입들이 Heap영역에 저장된다.
# Stack
함수의 호출과 관련된 **지역 변수, 매개변수**들이 저장되는 영역이다.
- Stack은 선형의 단순한 구조이면 시간 복잡도가 O(1)이다. 즉, 할당과 해제가 **빠르고 효율적**이다.
- CPU에 의해 관리되고 최적화 돼서 속도가 매우 빠르다.
- 함수가 종료되면 저장된 메모리도 해제된다.
- **컴파일 타임**에 결정되기 때문에 무한히 할당할 수 없다.
- 컴파일 단계에서 언제 생성되고 해제되는지 알 수 있는 struct와 같은 값들이 저장된다.
- 단, struct가 protocol을 채택하는 경우에는 **Heap영**역에 저장된다.
- 스레드 별로 독립적인 Stack 영역을 가지고 있기 때문에 **thread-safety** 하다.
## Heap과 Stack의 관계
Heap과 Stack은 같은 메모리 공간을 사용한다.
Heap 영역은 메모리의 낮은 주소 -> 높은 주소의 방향으로 할당된다.
Stack 영역은 메모리의 높은 주소 -> 낮은 주소의 방향으로 할당된다.
# 정리
메모리구조
- Code : 소스코드(기계어), ReadOnly
- Data : 전역변수, 정적변수
- Heap : 동적 할당/해제, 유일하게 런타임에서 결정, ARC, Thread-Safety X
- Stack : 매개변수, 지역변수, Thread-Safety O
'Swift' 카테고리의 다른 글
Swift로 웹사이트를 만드는 방법 (3) | 2023.02.21 |
---|---|
[iOS - Swift] rethrows (0) | 2022.11.07 |
Comments