WWDC Understanding Swift Performance 영상을 보다가, 이제껏 알고 있던 Swift 메모리 구조 관련 지식이 맞는지 확인하는 바 기록해본다!!
프로세스가 실행되면 OS에서는 메모리 공간을 할당해주는데, 그 공간은 모두 다 알다시피 총 4가지 (Code, Data, Heap, Stack) 으로 나누어진다. 그럼 각 공간들이 어떤 특징들을 가지고 있는지 알아보자!!
var kane: Person = Person(name: "kane") // 전역 변수로 데이터 영역에 할당 됨
var age: Int = 27
enum Style {
static let defaultNumber: Int = 123
}
ARC에 의해서 Reference Counting이 관리되는 영역이다. Code, Data, Stack, Heap 중에서 유일하게 런타임에 결정되기 때문에 데이터 크기가 확실하지 않은 가변적인 데이터 타입들이 Heap 영역에 할당된다.
Swift에서는 Class의 인스턴스, Closure, 그리고 가변적인 String, Array 같은 타입들이 Heap영역에 저장되는 것으로 알려져 있다
메모리를 단순히 Stack 포인터가 가리키고 있는 곳을 단순히 줄임으로써 필요한 메모리를 할당할 수 있다. 그리고 함수가 끝나면, Stack 포인터를 줄이기 전에 있던 곳으로 증가시킴으로써 그 메모리 할당을 해제할 수 있다. 할당/해제 과정이 매우 단순하기 때문에 효율적이다
But, 스택 오버플로우가 발생할 수 있다. 스택에 너무 많은 메모리를 할당하게 되면 App이 죽게 된다. 이 문제의 원인은 무한 루프, 재귀함수 등이 있다.
힙과 스택은 같은 메모리 공간을 사용하는데,
힙 영역은 낮은 메모리 주소부터 할당 받는 것,
스택 영역은 높은 메모리 주소부터 할당 받는 것이다
개발자 소들이 - 메모리 구조(Code, Data, Heap, Stack)
naljin - Value Type이 Heap영역에 할당될 수가 있다고?