메모리 구조
메모리 구조는 크게 스택 메모리, 힙 메모리, 코드섹션, 데이터섹션으로 나뉜다
코드섹션
코드 섹션은 프로그래머가 작성한 소스코드들이 저장되는 곳이다
데이터섹션
데이터섹션은 전역 변수와 정적 변수 등이 저장되는 곳이다
총 3가지로 구분된다
1. Initialized Data Section (초기화된 데이터 영역)
초기값을 가지는 전역 변수 및 정적 변수가 저장된다
2. Uninitialized Data Section (BSS 섹션, 초기화되지 않은 데이터 영역)
초기값을 가지지 않는 전역 변수 및 정적 변수가 저장된다
프로그램 실행 시 이 영역의 변수들은 0 또는 NULL과 같은 기본값으로 초기화된다
3. Read-Only Data Section (상수 데이터 영역 또는 Const Data Segment)
읽기 전용으로 지정된 초기화된 데이터가 저장된다
문자열 리터럴과 같은 읽기 전용 데이터가 이 영역에 할당된다
이 영역의 데이터는 수정이 허용되지 않는다
스택 메모리(Stack Memory)
스택 메모리는 지역 변수와 함수 호출에 관련된 데이터를 저장하는데 사용된다
스택 메모리는 후입선출(LIFO, Last-In-First-Out) 구조를 가지고 있다
이는 가장 최근에 저장된 데이터가 가장 먼저 제거되는 구조를 의미한다
특히, 함수가 호출될 때는 함수의 호출 정보(복귀 주소, 매개변수 등)가 스택 메모리에 저장된다
스택 메모리의 단점
1. 컴파일시에 크기가 미리 결정되므로, 런타임시에 용량을 추가하는 것은 불가능하다
또한, 최소한의 스택 메모리를 차지하는 특징을 가진다
2. 함수가 종료되면 해당 스택 프레임에 더이상 접근이 불가능하다
즉, 지역변수의 수명은 함수의 수명과 동일하다
더 오래 보존하려면, 데이터 섹션(전역변수 혹은 정적변수)에 저장해야한다
하지만, 데이터 섹션은 프로그램의 수명과 동일하다는 문제점이 있다
따라서, 런타임 시에 프로그래머가 원하는 만큼 할당하고
원하는 시점에 생성 및 삭제 가능한 메모리가 힙 메모리가 등장하게 되었다
힙 메모리(Heap Memory)
스택 메모리와 달리 컴파일러 및 CPU가 자동으로 메모리 관리를 해주지 않는다
따라서 프로그래머가 원하는 만큼, 원하는 때에 할당 및 반납을 하며 직접 관리해야한다
힙 메모리의 단점
1. 스택 메모리에 비해 할당 및 해제 속도가 느리다
스택 메모리는 자료구조 스택의 특성상 메모리 할당 및 해제에 걸리는 시간이 O(1) 이지만,
힙 메모리는 메모리 할당 및 해제를 일반적으로 효율적이고 빠른 알고리즘에 의존하는
힙 관리자(Heap Manager)가 수행하며,
힙 메모리의 메모리 할당 및 해제는 일반적으로 O(log n)에서 O(n)의 시간이 걸린다
하지만, 현대의 메모리 할당 알고리즘은 효율적이며 실제로는 상수 시간에 가까운 성능을 보인다
힙 메모리를 해제할 때는 별다른 연산을 하지 않고 값만 바꿔준다
힙 메모리는 할당 받아오려면 사용중이지 않은 메모리이면서 크기가 맞는지 체크해서 가져와야한다
또한 메모리 공간에 Fragmentation(메모리 조각화)이 생길 수도 있어서 효율적인 메모리 관리가 어렵다
2. 프로그래머가 직접 메모리 할당 및 해제 해야한다
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] typedef (0) | 2024.02.12 |
---|---|
[C] 동적 할당 (0) | 2024.02.11 |
[C] 문자열 정렬 (0) | 2024.02.10 |
[C] strrev() (0) | 2024.02.10 |
[C] strtolower(), strtoupper() (0) | 2024.02.10 |