728x90
Swift의 메모리 구조
- OS는 총 4가지의 메모리 영역을 가진다
- Code
- Data
- Heap
- Stack
1. Code 영역
- 컴파일 타임에 결정된다.
- 개발자가 작성한 소스 코드가 기계어 형태로 저장되는 영역
- 중간에 코드가 변경되지 않도록 read-only 형태로 저장된다.
2. Data 영역
- 컴파일 타임에 결정된다.
- 정적(static) 변수, 전역 변수 들이 저장되는 영역
- 프로그램 시작 시 할당, 프로그램 종료 시 해제
- 실행 도중 변수 값이 변경될 수 있기에 read-write 형태로 저장된다.
struct Person {
static let name: String = "park" //정적 변수 -> data 영역에 저장
}
var name: String? // 전역 변수 -> data 영역에 저장
3. Heap 할당
- 컴파일 단계에서 생성과 해제를 알 수 없는 '참조' 타입의 객체가 할당된다.
- '런타임' 시에 결정되는 영역 (4가지 영역 중 유일하게 런타임 시에 결정됨)
- '동적 할당' 되는 객체들
- 데이터의 크기가 확실하지 않을 때 사용하는 영역
- 즉, class 객체나 closure같은 참조타입들이 할당됨.
- 메모리 할당, 해제가 하나의 명령어로 처리되지 않기 때문에 관리가 어렵다.
- Heap은 참조 계산도 해줘야 하기 때문에 Stack보다 복잡하다.
- swift에서 이러한 참조 계산을 통한 메모리 해제를 자동으로 해주는 것이 ARC이다.
- Heap은 스레드들이 공유하는 영역이기 때문에 thread-safety하지 않다.
- 이를 관리하기 위해 lock과 같은 자원이 필요하고 이것이 오버헤드로 이어진다.
4. Stack 할당
- LIFO형태의 자료구조로 가장 마지막에 들어간 객체가 가장 먼저 나오게 된다.
- 자료 구조의 특성상 하나의 명령어로 메모리 할당, 해제가 가능하다.
- 컴파일 단계에서 언제 생성되고 해제되는지 알 수 있는 struct와 같은 값들이 저장된다.
- 단, struct가 protocol을 채택하는 경우엔 heap 영역에 저장됨
- 그 외에 지역 변수, 매개변수, 반환값 등이 저장된다.
- 함수가 종료되면 저장된 메모리도 해제 된다.
- 컴파일 타임에 영역이 결정되기 때문에 무한히 할당이 불가능하다.
- 영역이 한정되어 있기 때문에 큰 메모리는 할당할 수 없다.
- 스레드 별로 독립적인 Stack 영역을 가지고 있기 때문에 thread-safety 하다
- 즉, struct는 항상 unique한 copy만 생성되기 때문에, 이것이 곧 thread 별로 항상 동시에 하나의 독립적인 instance만 가지게 해주어서, thread-safe하게 만들어준다.
- 위의 특징들 덕에 Heap의 값을 쓰는 것보다 빠르다.
func add(a: Int, b: Int) -> Int { //파라미터 a, b 스택에 할당
let result = a + b //지역변수 result 스택에 할당
return result
}
728x90
'Swift' 카테고리의 다른 글
[Swift] 프로토콜 지향 프로그래밍 (Protocol Oriented Program) (0) | 2022.06.19 |
---|---|
[Swift] 왜 struct에선 mutating을 사용해야하는가? (0) | 2022.06.19 |
[Swift] Class vs Struct (0) | 2022.06.02 |
[Swift] deinit에서 self에 접근해도 되는가? (0) | 2022.06.02 |
[Swift] closure에서 self를 써야하는 이유 (0) | 2022.05.16 |
댓글