오늘 배울 주제인 ARC를 다뤄보기 전 메모리구조를 한번 알아보고 가보자이
운영체제에서는 메모리에 프로그램을 위한 공간을 할당해줍니다!
그 공간을 총 4가지로 나눌 수 있는데욥
code영역: 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
-> 간단히 우리가 작성한 소스 코드가 기계어 형태로 저장됨!
data영역: 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역
- 사용하고 난 후에는 반드시 메모리 해제를 해줘야 한다. 그렇지 않으면 memory leak이 발생한다.
- 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
- Swift에서는 closure, class 등 참조타입의 값이 힙에 자동 할당됨!
함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역
- 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
- 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.
- 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
stack | heap | |
---|---|---|
장점 | CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 굉장히 빠르다 | 메모리 크기에 대한 제한이 없다 |
단점 | 메모리 크기에 대한 제한이 있음 | 할당, 해제 작업으로 인한 속도 저하 |
데이터의 크기를 모르거나, 스택에 저장하기에 너무 큰 데이터인 경우 힙에 할당
물론 위에 경우는 클로저와 인스턴스처럼 자동으로 힙에 할당하는 것 외에 직접 할당 경우이당~
만약에 너무 많은 메모리를 스택에 할당하면 우리에게 다른 의미로 익숙한
스택 오버 플로우: 너무 많은 메모리 할당으로 스택 영역을 초과한 경우
힙 오버 플로우: 힙도 자신의 영역 외로 확장하면 오버 플로우 발생한다~