[Swift] 7. 메모리
OS 메모리 구조
- Swift에서 메모리는 주로 4개의 영역으로 나눌 수 있다.
1) Code 영역
- 실행 가능한 프로그램 코드를 기계어 형태로 저장한다.
- 이 영역은 읽기 전용(Read-Only) 이며, 프로그램의 실행 중에 변경되지 않는다.
2) Data 영역
- Swift 정적 변수, 상수, 타입 메타데이터 등을 저장한다.
- 프로그램 시작과 동시에 할당되어 프로그램이 종료디면 메모리가 해제된다.
-
실행 도중 변경될 수 있다.(Read-Write)
// 전역 변수: 데이터 영역 (.data), Read-Write var name: String = "Index" var age: Int = 26 struct People { // 타입(static) 상수: 읽기 전용 데이터 영역 (.rodata), Read-Only static let country: String = "Korea" // 인스턴스 프로퍼티: // — 선언된 컨텍스트가 전역(let people)일 경우 .data (Read-Only*) // — 함수 내부(let localPeople)일 경우 스택 (Read-Write) var name: String } // 전역 상수: 데이터 영역 (.data), Read-Only* let people = People(name: "Index")
타입 메타데이터
- Swift 데이터 영역에는 런타임에 타입 자체를 설명해 주는 메타데이터가 올라가 있어서, 제네릭 처리, 런타임 캐스팅, 동적 디스패치 등이 가능해진다.
- 이 타입이(Person, Int, String 등) 메모리에서 어떻게 생겼는지, 어디에 무엇이 들어있는지 등을 적어 놓은 설명서이다.
- 필드 위치, 크기, 프로토콜 구현 정보 등 포함
- 데이터 영역에 저장 -> 프로그램이 동작할 때 언제든 참조한다.
3) Heap 영역
- 동적 메모리 할당을 위해 사용된다.
- 힙 메모리는 프로그래머가 명시적으로 할당하고, 해제해야 하며, 힙 메모리 크기는 가상 메모리 크기에 의해 결정된다.
- 힙 매모리는 느리게 접근 되지만, 프로그래머가 필요에 따라 메모리를 할당하고 해제할 수 있어서 유연성이 높다.
-
클래스 인스턴스, 클로저와 같은 참조 타입의 값이 힙에 자동 할당된다.
class People { let country: String = "korea" let age: Int = 26 } // 인스턴스는 Heap 영역에 할당 된다. // Heap 메모리는 가상 메모리의 크기에 의해 결정되며, Heap 메모리의 크기는 실행 시점에 결정된다. let people = People()
4) Stack 영역
- 함수 호출과 로컬 변수의 생명주기를 관리한다.
- 스택은 LIFO(Last in First Out) 방식으로 동작하며, 함수가 호출될 때마다 새로운 스택 프레임이 생성되고, 함수가 종료될 때 스택 프레임이 해제된다.
// result는 스택 영역에 할당된다.
// 함수가 종료되면 result 변수는 자동으로 스택에서 해제된다,
func add(a: Int, b: Int) -> Int {
let result = a + b
return result
}
Reference
- https://tdcian.tistory.com/405
Leave a comment