728x90
반응형
C++에서 메모리 할당은 프레임 할당과 힙 메모리 할당으로 나눌 수 있습니다.
프레임 할당
프레임 할당은 함수를 호출할 때마다 설정되는 "스택 프레임"에서 해당 이름을 사용합니다.
스택 프레임은 함수에 대한 인수와 함수에 로컬로 정의된 변수를 일시적으로 보유하는 메모리 영역입니다.
프레임 변수는 컴파일러가 자동으로 공간을 할당하기 때문에 종종 "자동" 변수라고 합니다.
특징
- 일반적으로 실제 메로리 블록 자체로 작업합니다.
- 지역 변수를 정의할 때 큰 배열 또는 데이터 구조인 경우에도 전체 변수를 보유할 수 있는 충분한 공간이 스택 프레임에 할당됩니다.
장점
- 프레임 변수는 범위를 벗어나면 자동으로 삭제됩니다.
- 간단한 기본 유형(int or byte), 배열 또는 데이터 구조의 경우 자동 삭제는 단순히 변수가 사용하는 메모리를 회수하는 것입니다.
- C++ 객체의 경우, 객체가 프레임 변수로 정의되면 정의가 발생하는 지점에서 해당 생성자가 자동으로 호출되고, 객체가 범위를 벗어나면 객체의 메모리가 회수되기 전에 해당 소멸자가 자동으로 호출됩니다.
- 이는 메모리 누수를 유발하는 잊어버린 객체에 대해 걱정 할 필요가 없는 장점입니다.
단점
- 프레임 변수를 범위 외부에서 사용할 수 없다.
- 큰 구조 및 객체의 경우 스택 공간이 제한되는 경우가 많다.
힙 할당
힙은 프로그램의 메모리 할당 요구 사항에 맞게 예약되며 프로그램 코드와 스택을 제외한 영역을 말합니다.
일반적으로 기본 제공 연산 new, delete로 객체를 할당하고 해제 할 수 있습니다.
특징
- 힙은 항상 메모리 블록에 대한 포인터가 부여됩니다.
장점
- 힙에 할당된 객체의 총 크기는 시스템의 사용 가능한 가상 메모리에 의해서만 제한됩니다.
단점
- 프로그래머가 명시적으로 할당하고 해제해야 합니다.
- 메모리 할당 후 해제하지 않으면 메모리 누수를 유발 할 수 있습니다.
여기까지 글은 출처 문서를 요약한 내용입니다.
아래의 글부터는 GPT와의 대화를 통해 정리한 내용으로 출처가 불분명한 정보입니다.
스택 메모리
스택 메모리는 함수 호출과 지역 변수의 저장을 위해 사용되는 메모리 영역입니다.
장점
- 컴파일러가 함수 호출 시 자동으로 메모리를 할당하고 함수 실행이 끝나면 자동으로 해제합니다.
- CPU가 스택 메모리를 효율적으로 사용할 수 있도록 설계되어 있어 메모리 접근 속도가 빠릅니다.
단점
- 스택은 일반적으로 크기가 제한되어 있습니다.
- 함수가 종료되면 메모리가 해제되므로 함수 외부에서는 접근이 불가합니다.
힙 메모리
힙 메모리는 프로그래머가 직접 메모리를 할당하거나 해제하는 데 사용하는 메모리 영역입니다.
장점
- 동적으로 메모리를 할당하므로 유연하게 사용할 수 있습니다.
- 스택에 비해 훨씬 큰 메모리를 사용할 수 있습니다.
단점
- 힙은 스택보다 메모리 접근 속도가 상대적으로 느립니다.
- 프로그래머가 메모리를 직접 관리(new, delete)하여 메모리 누수나 단편화가 발생할 수 있습니다.
스택 메모리가 힙 메모리보다 빠른 이유는?
메모리 관리 방식
- 스택은 Last In, First Out (LIFO) 방식으로 동작합니다. 즉, 데이터를 쌓듯이 할당하고, 나중에 할당된 데이터부터 먼저 해제합니다. 스택은 메모리 할당과 해제가 매우 단순해서, 새로운 변수를 추가하거나 삭제할 때 단순히 스택 포인터만 이동시키면 됩니다. 따라서 매우 빠른 속도로 처리할 수 있습니다.
- 힙은 동적으로 메모리를 할당하는 구조로, 메모리 블록을 원하는 크기만큼 할당하고 해제하는 작업이 필요합니다. 힙은 메모리 블록을 관리하기 위해 할당된 영역과 남은 영역을 추적하는 추가적인 비용이 발생하며, 할당과 해제가 불규칙하게 일어나기 때문에 메모리 단편화가 발생할 수 있어 성능이 저하될 수 있습니다.
구조적 차이
- 스택은 고정된 크기의 연속적인 메모리 블록으로 할당되며, 스택 포인터가 상하로 움직이면서 매우 간단한 방식으로 메모리를 관리합니다. 메모리 접근이 연속적이기 때문에 캐시 성능도 좋습니다.
- 힙은 크기와 할당 순서가 제각각인 블록들로 구성되어 있어 메모리 접근이 비연속적일 수 있고, 이로 인해 캐시 미스가 더 자주 발생할 수 있습니다. 또한, 힙에서 메모리 할당을 요청할 때마다 복잡한 메모리 관리 알고리즘이 동작하므로 더 많은 시간이 소요됩니다.
스택 메모리는 단순하고 연속적인 구조 덕분에 빠르고, 힙 메모리는 복잡한 관리와 비연속적 구조 때문에 상대적으로 느립니다.
728x90
반응형
'개발 > C++' 카테고리의 다른 글
[C++] unsigned char와 EOF (0) | 2024.06.27 |
---|