C++에서 스택 대 힙 메모리 할당 활용

Jinku Hu 2023년10월12일
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;
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ Memory