본문 바로가기
CS

[Swift] 메모리구조 - 코드, 데이터, 힙, 스택 (Code,Data,Heap,Stack)

by 데브킹덕 2022. 9. 20.

우리가 작성하는 코드 덩어리들을 프로그램이라고 함

 

이 프로그램을 실행하면 운영체제(Operating System)에서 메모리(RAM)에 프로그램을 위한 공간을 할당해줌

 

이때 메모리 공간은 코드, 데이터, 힙, 스택 으로 나누어 공간을 할당 할 수 있도록 함

 

 

 

Code 코드영역

- 우리가 작성한 소스코드가 0,1로 이루어진 컴퓨터 밑단위 언어인 기계어 형태로 저장됨

- 실행파일을 구성하는 명령어들이 올라감 (함수, 제어문, 상수 등)

- 컴파일 타입에 의해 결정

- 프로그램을 실행했는데 중간에 코드가 변경된다고 해서 프로그램이 변경 되면 안되어 Read-Only형태로 저장

 

 

 

Data 데이터영역

- 전역변수, static 변수가 저장됨

- 프로그램 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 해제됨

- 실행도중 변수 값이 변경 될 수 있어 Read-Write 형태로 저장

 

struct Person{
	static let nickname = "개발자유망주"
} 

//static 변수로 데이터 영역에 할당

var name: String?
var age: Int?

//전역변수로 데이터 영역에 할당

 

 

 

 

Heap 힙영역

 

- 프로그래머가 할당/해제 하는 메모리 영역 

- 프로그래머는 malloc으로 힙에 할당, calloc으로 힙에 메모리를 해체 할 수 있음 

- 이것을 '동적 할당'이라고 함 

- Swift에서는 ARC를 통해 힙에 할당된 메모리가 더이상 쓸모 없어지면 자동으로 해제해줌

- 사용 후에는 반드시 메모리를 해제 해주어야함 

- 그렇지 않을시 memory leak이 발생

- Code,Data,Stack 중 유일하게 런타임시 결정됨

- 데이터의 크기가 확실하지 않을 때 사용함

- 클랜스 인스턴스, 클로져 참조타입일 경우 사용 

- 메모리 크기에 대한 제한이 없음

- 전역의 범위이기에 모든 함수에서 액세스 가능함

- 할당, 해제 작업으로 속도가 저하됨

- 두개 이상의 쓰레드가 동시에 접근하면 Lock이 걸려 속도가 저하됨

- 메모리를 해제해주지 않으면 메모리 누수가 발생하므로 직접 관리해야 됨 

- 스택보다 상대적으로 느림 

class Person{
	var nickname: String?
    var age: Int?
}


var person = Person(nickname: "개발자유망주", age: 28)

 

Stack 스택영역

 

- 함수호출시 함수의 지역변수, 매개변수, 리턴 값 등을 저장

- 함수가 종료되면 저장된 메모리도 해제됨

- 컴파일 타임에 결정되기 때문에 무한히 할당 할 수 없음

- 프로그램이 자동으로 사용하는 임시 메모리 영역

- CPU에 의해 관리되고 최적화되어 효율으로 구성하여 속도가 매우 빠름

- 메모리를 직접 해제해주지 않아도 됨

- 메모리 크기에 제한이 있으며 지역변수만 접근이 가능 

 

func sum(_num1: Int, _num2: Int2) -> Int{
	let ans = num1 + num2
	return ans
}

num1, num2 파라미터, 지역변수 ans는 스택에 할당되고 sum함수가 종료되는 시점에 스택 메모리에서 반환

 

 

 

'CS' 카테고리의 다른 글

DFS  (0) 2023.12.13
[CS] 런타임 vs 컴파일타임  (0) 2023.06.28