[C++]C 프로그램의 메모리 레이아웃

dumdumer·2024년 9월 5일
0

C++

목록 보기
2/5

C/C++에서 메모리에 올라가는 프로그램의 구조는 크게 스택, 힙, 데이터, 텍스트 영역으로 나뉜다. 이에 대해 정리한 내용이다.

텍스트 영역

프로그램의 실제 코드가 저장되는 영역이다.

  • 텍스트 영역은 주로 읽기 전용이고 공유 가능하다는 특징이 있다.
  • 읽기 전용의 장점은 프로그램이 급작스럽게 수정되는 일이 발생하지 않도록 막는 것이다.
  • 공유 가능하다는 것은 텍스트 편집기나 C 컴파일러, 셸 등이 프로그램 코드를 사용할 때 코드 사본을 따로 만들지 않고 텍스트 영역을 공유해 사용할 수 있다.
  • 텍스트 영역은 메모리 영역에서 힙이나 스택 아래에 배치되어 힙/스택 오버플로우로 인한 영향을 피하도록 설계되기도 한다.

데이터 영역

전역 변수나 정적 변수가 저장되는 메모리 영역이다. 크게 데이터 영역과 BSS 영역으로 나뉜다.

  • Data 영역은 초기화된 데이터 영역(Initialized Data Segment)이라고도 불리며, "프로그래머가" 초기화한 전역 변수, 정적 변수가 저장된다.

  • Data 영역은 "초기화된 읽기 영역"과 "초기화된 읽기-쓰기 영역"으로 나뉜다.

    예를 들어, 전역 변수로 선언한 const char* str = "hello world"라는 코드에서,
    "hello world"라는 문자열 리터럴은 const로 선언되어 초기화된 읽기 영역에 저장된다.
    포인터 변수 str은 읽기-쓰기 영역에 저장된다.

  • BSS 영역은 Block Started by Symbol의 약자로, 초기화되지 않은 전역 변수나 정적 변수가 저장된다. 프로그램 실행 전에 커널에 의해 0으로 초기화된다.

int x = 10; // Data segment memory
int y;      // BSS segment memory

int main(){
	int a = 10; // stack memory
}

스택 영역

스택(Stack) 영역은 함수의 호출과 관계되어 있는 데이터들이 저장되는 영역이다.

  • 한 함수 호출에 대해 스택에 push된 값 집합을 "스택 프레임(stack frame)"이라고 한다.
  • 스택 프레임에는 반환할 주소나 함수의 매개변수와 지역변수 등이 저장된다.
  • 주로 높은 주소에서 낮은 주소로 할당이 이루어진다.

힙 영역

힙(heap) 영역은 동적 할당이 이루어지는 영역이다.

  • C++에서는 new/new[]키워드를 통해 동적 할당을 하고, delete/delete[] 키워드를 통해 해제한다.
  • 일반적으로 낮은 주소에서 높은 주소로 할당이 이루어진다.

스택, 힙 비교

StackHeap
메모리 구성연속적임(LIFO)할당 내에 연속적임. 할당 간의 단편화 발생(가상머신에 따라 차이)
최대 크기리눅스(8MB), 윈도우(1MB)메모리 시스템 전체
메모리 초과시함수 호출 시 프로그램 크래시예외 or nullptr
할당컴파일타임런타임
지역성높음낮음
스레드 관점각 스레드가 스텍 공간을 각각 차지함스레드끼리 공유함

.
.
.
C++ 공부를 위해 작성된 글입니다. 오류가 있다면 지적해 주시면 감사하겠습니다.

참고자료
https://github.com/federico-busato/Modern-CPP-Programming (05.Basic_Concepts_IV)

https://www.geeksforgeeks.org/memory-layout-of-c-program

profile
tik tok

0개의 댓글