메모리 구조는 Code 영역, Data 영역, Heap 영역, Stack영역으로 구성되어 있음
Code 영역
작성한 코드가 기계어로 저장됨
Compile(컴파일) Time 결정
중간에 코드가 변경되지 않도록 Read-Only 형태로 저장
Data 영역
전역 변수, static 변수 저장 ※ Swift static 키워드는 lazy가 기본 동작 → 해당 값에 접근할 때 메모리에 할당
프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리 해제됨
실행 도중 변숫값이 변경될 수 있으니 Read-Write로 지정
Heap 영역
malloc / alloc으로 Heap에 메모리 할당할 수 있음 (동적할당)
사용하고 난 후 반드시 메모리 해제해야 함 → 해제하지 않을 경우 memory leak 발생
Code, Data, Stack 중 유일하게 RunTime 시 결정 → 데이터의 크기가 확실하지 않은 경우 사용 → Class Instance, Closure (참조 타입)은 모두 Heap에 할당
장점 ① 메모리 크기에 제한이 없음 ② 본질적인 범위가 전역 → 프로그램의 모든 함수에서 액세스 가능
단점 ① 할당 / 해제 작업 → 속도 저하 ② Heap 손상(이중 해제, 해제 후 사용 등) → 작업으로 인한 속도 저하 ③ Heap 경합(두 개 이상의 Thread가 동시에 접근하려고 할 때 Cock가 걸림)으로 인한 속도 저하 ④ 메모리를 직접 관리 해야 함(해제 않을 경우 → 메모리 누수 발생)
Stack 영역
함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등을 저장
함수가 종료되면 저장된 메모리도 해제
Compile Time에서 결정 → 무한히 할당할 수 없음
장점 ① CPU가 Stack 메모리를 효율적으로 구성 → 속도가 매우 빠름 ② 메모리를 직접 해제하지 않아도 됨