[Algorithm] Memory 구조

JAsmine_log·2024년 6월 14일

Memory

메모리는 아내와 같은 구조를 갖는다. 그리고, 각각의 변수는 특정 구조에 저장된다.
이는 각각 Code Segment, Data Segment(Initialized Data, Uninitailized data), Heap, Stack이다.

+-----------------------+
|       Code Segment    |  <- 프로그램의 실행 코드
+-----------------------+
| Initialized Data      |  <- 초기화된 전역 변수와 정적 변수
+-----------------------+
| Uninitialized Data    |  <- 초기화되지 않은 전역 변수와 정적 변수 (BSS)
+-----------------------+
|       Heap            |  <- 동적 메모리 할당 (위로 성장)
|                       |
|                       |
|                       |
+-----------------------+
|       Stack           |  <- 함수 호출 및 지역 변수 (아래로 성장)
|                       |
|                       |
|                       |
+-----------------------+

구조

코드 세그먼트 (Code Segment):

  • 프로그램의 실행 코드가 저장되는 영역
  • 읽기 전용으로, 일반적으로 실행 중에 변경되지 않음

데이터 세그먼트 (Data Segment):

  • 정적 변수와 전역 변수가 저장되는 영역
  • 데이터 세그먼트는 두 부분으로 나뉨
    • 초기화된 데이터 세그먼트 (Initialized Data Segment):
      프로그램 시작 시 초기화된 전역 변수와 정적 변수가 저장
    • 초기화되지 않은 데이터 세그먼트 (BSS - Block Started by Symbol):
      초기화되지 않은 전역 변수와 정적 변수 저장 프로그램 실행 중에 0으로 초기화

힙 (Heap):

  • 동적 메모리 할당을 위한 공간
  • new 및 malloc 등의 연산자를 통해 런타임에 동적으로 할당되는 메모리 블록들을 저장
  • 힙 메모리는 수동으로 해제 (delete 또는 free)해야 함

스택 (Stack):

  • 함수 호출과 지역 변수를 위한 메모리 공간
  • 함수가 호출될 때마다 새로운 스택 프레임이 생성
  • 함수가 반환되면 해당 스택 프레임이 해제
  • 지역 변수와 함수 인자는 스택에 저장
  • 스택 메모리는 자동으로 관리되며, 함수가 종료되면 스택 메모리가 자동으로 반환

Code

  • global_var는 초기화된 데이터 세그먼트에 저장됨
  • global_uninit_var는 초기화되지 않은 데이터 세그먼트 (BSS)에 저장됨
  • local_var는 스택에 저장
  • heap_var는 동적으로 할당된 메모리로, 힙에 저장 heap_var 자체는 스택에 저장된 포인터
#include <iostream>
using namespace std;

int global_var = 50;          // 초기화된 전역 변수 : Initialized Data Segment
int global_uninit_var;        // 초기화되지 않은 전역 변수 : BSS

void foo() {
    int local_var = 5;        // 지역 변수 : Stack
    int* heap_var = new int;  // 동적 메모리 할당 : Heap
    *heap_var = 20;
    cout << "Local variable: " << local_var << endl;
    cout << "Heap variable: " << *heap_var << endl;
    delete heap_var;          // 동적 메모리 해제
}

int main() {
    foo();
    return 0;
}
profile
Everyday Research & Development

0개의 댓글