이 부분이 궁금한 경우 메모리 할당 부분에서의 궁금증일텐데, 아래 위키피디아가 너무 설명이 잘되어 있어서 먼저 첨부한다!
https://ko.wikipedia.org/wiki/%EB%8F%99%EC%A0%81_%EB%A9%94%EB%AA%A8%EB%A6%AC_%ED%95%A0%EB%8B%B9
위의 사진 처럼 C언어의 메모리 영역 중 스택 메모리와 힙 메모리를 말하는 것이다.
1. 스택 메모리 (Stack Memory)
스택 메모리는 함수 호출과 함께 자동으로 할당되고, 함수가 종료되면 자동으로 해제되는 메모리 영역이다.
- 고정 크기
스택 메모리는 함수 호출 시, 컴파일러가 크기를 미리 결정한다. - LIFO 구조
스택은 Last In, First Out(후입선출) 구조로 동작한다. 함수가 호출되면 스택에 데이터가 쌓이고, 함수가 종료되면 해당 데이터가 제거된다. - 자동 관리
스택 메모리는 사용자가 따로 신경 쓰지 않아도, 함수 호출 및 종료 시 자동으로 관리된다. - 빠른 속도
메모리 할당 및 해제 속도가 매우 빠르다.
사용 예시
스택 메모리는 함수 내 지역 변수와 함수의 매개변수, 리턴 주소 등을 저장하는 데 사용된다.
장점
자동 관리와 빠른 속도로 편리하게 사용할 수 있다.
단점
스택 메모리는 크기에 제한이 있어 큰 데이터를 저장하기 어렵다. 또한, 재귀 호출이 과도하면 스택 오버플로(Stack Overflow)가 발생할 수 있다.
2. 힙 메모리 (Heap Memory)
힙 메모리는 런타임 중에 프로그래머가 필요에 따라 직접 메모리를 할당하거나 해제할 수 있는 영역이다.
- 동적 크기
힙 메모리는 런타임에 동적으로 크기를 결정할 수 있다. - 수동 관리
C에서는 malloc(), calloc(), realloc() 함수를 통해 메모리를 할당하고, free() 함수를 통해 메모리를 해제해야 한다. - 비교적 느림
시스템 호출을 통해 메모리가 할당되기 때문에 스택 메모리에 비해 속도가 느리다. - 단편화 가능성
메모리를 잘못 관리하면 메모리 단편화(Fragmentation)가 발생할 수 있다.
사용 예시
힙 메모리는 크기를 알 수 없는 데이터, 동적으로 생성된 배열이나 객체를 저장하는 데 사용된다.
장점
크기에 제한이 없으며, 유연하게 메모리를 사용할 수 있다.
단점
메모리 해제를 잊으면 메모리 누수(Memory Leak)가 발생할 수 있다. 또한, 이미 해제된 메모리에 접근하면 정의되지 않은 동작(Undefined Behavior)이 발생한다.
스택 메모리와 힙 메모리의 차이점
특징스택 메모리(Stack)힙 메모리(Heap)
메모리 관리 | 자동 관리 | 수동 관리 |
할당/해제 속도 | 빠름 | 느림 |
메모리 크기 | 제한적 (작은 크기) | 유동적 (큰 크기 가능) |
용도 | 지역 변수, 함수 호출 시 데이터 | 동적 데이터 |
단편화 | 없음 | 발생 가능 |
라이프사이클 | 함수 실행 중 존재, 함수 종료 시 소멸 | 해제되지 않으면 지속됨 |
3. 메모리 관리 시 주의점
- 스택 오버플로(Stack Overflow)
스택 크기를 초과하면 프로그램이 비정상 종료될 수 있다. 특히, 깊은 재귀 호출은 스택 오버플로를 유발하기 쉽다. - 힙 메모리 누수(Memory Leak)
힙 메모리는 사용 후 반드시 free()를 호출해 해제해야 한다. 해제하지 않으면 메모리 누수가 발생해 시스템 자원을 낭비한다. - 잘못된 메모리 접근
스택에서는 범위를 벗어난 변수에 접근하면 예상치 못한 결과가 발생할 수 있다. 힙에서는 이미 해제된 메모리에 접근하면 프로그램이 비정상적으로 동작하거나 충돌할 수 있다.
'개발 > C, C++' 카테고리의 다른 글
[ C++ ] C++의 단짝 STL 🧏🏻♀️ (0) | 2024.01.13 |
---|---|
[C++] C++ 입출력 속도를 더 빠르게 처리하는 방법 (0) | 2023.07.08 |
[C언어] 프로그래밍 개론/C언어 개론 (0) | 2023.06.23 |