티스토리 뷰

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) 과 달리 메모리 크기 제한
  • 지역 변수만 액세스 가능 

 

시점

컴파일 타임

 


참고

babbab2

sihyungyou

728x90