C++에서 스택 대 힙 메모리 할당 활용
이 기사에서는 C++에서 스택 대 힙 메모리 할당을 활용하는 방법에 대한 몇 가지 방법을 설명합니다.
C++에서 스택과 힙 메모리의 차이점
메모리의 개념을 논의 할 때 가장 일반적인 사용자 프로그램이 실행되는 시스템의 관점에서 생각하는 것이 가장 좋습니다. 대부분의 사용자 프로그램은 하드웨어 리소스를 관리하고 사용자 프로그램이 처리하기에는 너무 복잡하거나 비효율적 인 다양한 작업을 처리하는 운영 체제 환경에서 실행됩니다. 이러한 작업 중 하나는 하드웨어 메모리를 직접 관리하는 것입니다. 따라서 거의 모든 운영 체제는 하드웨어 메모리와 상호 작용하는 특수 구조 및 기능을 제공합니다. 운영 체제에서 제공하는 메모리 구조의 두 가지 일반적인 개념은 스택과 힙입니다.
스택은 시스템에서 실행중인 각 프로그램을 위해 예약 된 메모리 영역이며 LIFO 방식으로 작동합니다. 즉, 프로그램이main
함수 실행을 시작하면 후자는 스택 프레임 (스택 메모리의 하위 집합)을 가져 와서 로컬 변수와 함수 호출 반환 주소가 자동으로 저장됩니다. main
이 다른 함수를 호출하면 연속적인 방식으로 이전 스택 프레임 뒤에 새 스택 프레임이 생성됩니다. 최신 스택 프레임은 해당 함수에 대한 로컬 객체를 저장하고이 메모리를 반환 할 때 사용되지 않습니다.
스택 크기는 기본적으로 대부분의 시스템에서 고정되어 있지만 사용자에게 특별한 요구 사항이있는 경우 어느 정도까지 사용자 지정할 수 있습니다. 스택 메모리의 크기 제한으로 인해 작고 대부분 임시 개체에 적합합니다. 예를 들어 Linux 운영 체제에서 사용자 프로그램의 기본 스택 크기는 8MB입니다. 프로그램이 처리해야하는 하나의 JPEG 사진보다 작을 수 있으므로 사용자는이 공간을 부지런히주의하여 사용해야합니다. 다음 코드 조각에서 선언 된 변수는 모두 스택 메모리에 저장됩니다. 일반적으로static
또는volatile
과 같은 특수 지정자가 없으면 모든 지역 변수가 스택에 할당됩니다.
#include <iostream>
using std::cout;
using std::endl;
int main() {
int var1;
int var2 = 123;
int arr1[4] = {1, 2, 3, 4};
int var3 = var2;
cout << var1 << endl;
cout << var2 << endl;
cout << var3 << endl;
return EXIT_SUCCESS;
}
출력:
0
123
123
다른 한편으로, 힙 ( free store
라고도 함)이라는 메모리 영역이 있습니다. 여기서 대형 객체를 저장하고 런타임 동안 프로그래머가 수동으로 할당 할 수 있습니다. 이 두 가지 기능은 힙 메모리를 본질적으로 동적으로 만듭니다. 그 크기는 컴파일 타임이나 프로그램 실행 중 어떤 순간에 결정될 필요가 없기 때문입니다. 프로그램은 특수 기능을 호출하고 운영 체제에서 할당을 요청할 수 있습니다. 힙 메모리는 더 많은 메모리를 요청하기 위해 다른 할당 함수를 호출하는 것으로 제한되지 않으므로 프로그램의 관점에서 무한 해 보일 수 있습니다. 그러나 운영 체제는 실행중인 모든 프로세스의 메모리를 관리합니다. 사용 가능한 실제 메모리가 더 이상 없을 때 새 할당을 거부 할 수 있습니다.
운영 체제의 메모리 시스템은 매우 복잡하고 다양한 OS / 하드웨어 관련 개념에 대한 이해가 필요하므로이 항목에서는 힙 및 스택 메모리에 대한 최소한의 내용 만 다룹니다. C++ 언어의 힙 메모리 수동 관리는new
/delete
연산자 또는malloc
/free
함수를 사용하여 수행 할 수 있습니다. 이러한 함수는 사용자가 일반적으로 할당 할 바이트 수를 지정하는 유사한 방식으로 작동하고 동일한 양의 메모리가 할당 된 주소를 반환합니다. 따라서 프로그래머는 필요에 따라 주어진 메모리 영역에서 작업 할 수 있습니다.
다음 코드 샘플은 힙 메모리에 다른 개체를 할당하는 몇 가지 사례를 보여줍니다. 수동 메모리 관리의 중요한 기능 중 하나는 할당 된 메모리 영역이 더 이상 필요하지 않을 때 운영 체제로 되 돌리는 것입니다. 후자의 작업은 할당 상대에 해당하는delete
/free
호출을 사용하여 수행됩니다. 프로그램이 불필요한 메모리를 해제하지 않으면 운영 체제의 메모리가 부족해질 위험이 있으며 그 결과 프로그램이 종료 될 수 있습니다. 그러나 이전 문제는 대부분 장기 실행 프로그램에서 발생할 것으로 예상되며 메모리 누수 버그로 특징 지어집니다.
#include <iostream>
using std::cout;
using std::endl;
int main() {
auto var4 = new int;
cout << var4 << endl;
int *arr2 = new int[4];
auto arr3 = new int[4];
cout << arr2 << endl;
cout << arr3 << endl;
delete var4;
delete[] arr2;
delete[] arr3;
return EXIT_SUCCESS;
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook