iOS
[iOS] 메모리 구조 (memory)
Peppo
2022. 4. 6. 20:18
728x90
코드 영역 (Code)
소스 코드 → *기계어 형태로 변형되어 수정이 불가능하게 Read-Only로 저장 된다.
기계어: 컴퓨터가 읽을 수 있는 0, 1 로 이루어진 언어.
시점
컴파일 타임
데이터 영역 (Data)
전역변수, 정적 (static) 변수가 저장 되는 영역
struct Person {
// 정적 변수로 데이터 영역에 할당
static let name = "Peppo"
}
// 전역변수로 데이터 영역에 할당
var age = Int
var height = Int
시점
컴파일 타임
프로그램이 시작할 때 할당
프로그램 종료시 소멸
힙 영역 (heap)
개발자가 할당/ 해제 하는 메모리 영역
mallock, calloc 으로 힙에 메모리를 할당할 수 있고, 이를 '동적 할당' 이라 한다.
사용 후 반드시 메모리 해제를 해줘야 한다. (why? - 메모리 누수 발생 때문)
BUT!
Swift의 경우,
class 인스턴스, 클로저 같은 참조 타입의 값을 통해 힙에 자동 할당/ 해제가 된다. (ARC)
예시
class Person {
var name: String
var age: Int
}
// class 인스턴스는 힙, person 변수는 스택 영역에 자동 할당 (ARC)
var person: Person = Person()
특징
- 메모리 크기에 대한 제한이 없음
- 전역 범위라 프로그램의 모든 함수에서 액세스 가능
시점
Code 영역, Data 영역, Stack 영역 중 유일하게 런타임 시 결정
스택 영역 (stack)
함수 호출 시, 함수 내부의 지역변수, 매개변수(parameter), 반환 값(return) 등이 저장되고,
함수가 종료되면 저장된 메모리도 자동으로 해제된다.
장점
스택은 CPU에서 관리하고 최적화 하기 때문에 힙(Heap)에 비해 속도가 빠릅니다.
func printName(food: String, rate: Int) -> String {
let message = "\(food)의 평점은 \(rate)점 입니다."
return message
}
printName(food: "대게", rate: 5)
// 대개의 평점은 5점 입니다.
단점
- 힙(Heap) 과 달리 메모리 크기 제한
- 지역 변수만 액세스 가능
시점
컴파일 타임
참고
728x90