EEYatHo 앱 깎는 이야기

CS ) 메모리 영역 (Code, Data, Stack, Heap) - EEYatHo iOS 본문

CS

CS ) 메모리 영역 (Code, Data, Stack, Heap) - EEYatHo iOS

EEYatHo 2022. 12. 28. 13:29
반응형

 

 

메모리 영역


  • 프로세스가 적재될 때 할당받은 주소 공간
  • Code, Data, Stack, Heap 구조로 되어있음 ( 논리적 구분 )
  • 다른 프로세스들과 독립된 메모리 영역

 

 

Code


  • 작성한 코드가 컴파일되어 기계어로 저장된 영역
  • 컴파일 타임에 크기 결정
  • Read-Only

 

 

 

Data


  • Global(전역), Static(정적) 변수 언제 어디서든 접근 가능한 값이 저장되는 영역
    ( static 은 Class.various 로 접근 가능 )
  • 컴파일시, Data 영역의 주소를 가르키게 바뀐다
  • 전역변수가 바뀔 수 있기에 Read-Write
  • 초기화시키지 않은 전역, 정적 변수들은 BSS(Block Stated Symbol) 영역에 따로 저장
  • 컴파일 타임에 크기 결정
class MyClass {
    static let myStaticNum: Int = 777
}

let name: String = "name"
var age: Int = 27

 

 

 

Stack


  • Local(지역), Parameter(매개) 변수 임시로 사용하는 값을 저장하는 영역 (+ 리턴 값, 리턴 메모리 주소.. )
  • 프로그램이 사용하는 임시 메모리 영역
  • 컴파일 타임에 크기 결정 ( 이미 정해진 크기가 있고, 런타임에 넘으면 Overflow )
  • 함수가 실행될 때 메모리에 할당되며, 함수가 끝나면 반환
  • 무한 재귀함수를 호출할 경우, Stack Overflow 가 발생하는 것을 볼 수 있음

 

 

 

Heap


  • Class, Closure크기가 확실하지 않은 데이터를 위해 존재하는 공간
  • 프로그래머가 사용하는 메모리 영역
  • ReferenceType 을 위한 공간
    동적으로 크기가 변할 수 있는 값들을 Heap 에 넣고, 주소로 참조(reference)접근
    ReferenceType 안의 ValueType 값은 Heap에 저장됨
    (ex. Class 안의 Struct 변수는 Heap 에 저장됨 )

  • 언어에 따라 수동으로 메모리 할당과 해제가 필요
    C 에서는 malloc, calloc 등으로 메모리를 할당하고, free, release 등으로 해제도 해줘야하지만,
    Swift 에서는 ARC 가 알아서 해제 해줌

  • 유일하게 런타임에 크기가 결정 (동적으로 크기가 변함)
  • 메모리 누수 위험, 메모리 할당 및 해제 작업으로 인한 느린 속도가 단점

 

 

 

Comments