[C++] 메모리 할당

2023. 7. 7. 04:44Algorithm/with C++

0. 참고자료

 

 

프로그램의 메모리 세그먼트 구조 : Code(text), Data(data, bss) Segment, Stack, Heap

프로그램을 실행하게 되면, CPU 프로세서는 보조기억장치(HDD, SDD)에 있는 프로그램 정보를 읽어...

blog.naver.com

 


1. 프로세스 메모리 구조와 할당

 

Segment 방식은 가상주소(virtual address)인 논리적 주소(logical address)를 사용한다.

 

프로그램에 따른 상대적 위치를 바탕으로 Offset을 더하는 방식으로 메모리의 물리적 주소(physical address)에 접근한다.

 

 

위로 갈수록 조금이라도 더 정적?이라고 할 수 있겠다.

 

 

가. 정적 할당

 

컴파일 단계에서 메모리를 결정하는 것.

  • code/ text segment
  • Data segment
  • BSS segment

Data segment와 BSS segment를 나누는 이유는 데이터를 보다 효율적으로 처리하고 관리하기 위해서다.

 

기본적으로, 실행 파일은 디스크 상에 위치해 있으며 프로그램이 실행될 때 운영 체제에 의해 RAM으로 로드된다.

 

이때 Data Segment와 BSS Segment는 다음과 같이 처리된다:

  1. Data Segment
    : 초기화된 전역 변수와 정적 변수를 포함한다.
    : 프로그램이 로드될 때, 이러한 값들은 디스크 상의 실행 파일에서 RAM으로 복사됩니다.
    : 따라서 이 데이터들은 디스크에 저장되어 있는 상태에서 시작하며, 프로그램이 실행될 때 메모리로 불러와집니다.
  2. BSS Segment
    : 초기화되지 않은 전역 변수와 정적 변수를 저장한다.
    : 프로그램이 시작될 때, 이러한 변수들은 디스크 상의 실행 파일에 포함되어 있지 않습니다.
    : 대신에, BSS 세그먼트는 프로그램이 실행될 때 생성되며, 운영 체제에 의해 메모리 상에 할당되고 모든 변수들은 0으로 초기화됩니다.

 

Data Segment와 BSS Segment를 구분함으로써, 우리는 초기화된 데이터와 초기화되지 않은 데이터를 분리하여, 메모리를 보다 효과적으로 관리하고, 프로그램의 실행 속도를 향상할 수 있습니다.

 

출처 : ChatGPT 4.0

 

나. 동적 할당

 

런타임 시 메모리를 할당하는 것.

  • Heap
  • Stack

하나의 함수 호출에 의해 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.

 

Stack은 재귀함수가 호출된다고 했을 때 매번 새로운 스택 프레임을 생성한다.

 

즉, 기존 재귀함수 내의 지역변수로 선언하게 되면 해당 변수는 독립적이고 다른 함수에 있는 변수에 영향을 끼치지 않는다.

 

대부분의 시스템에서 기본 스택 크기는 생각보다 작습니다.

 

따라서, 이 방법으로 큰 배열을 선언하면 스택 오버플로우를 일으킬 수 있습니다.

 

힙은 스택보다 훨씬 큰 메모리 공간을 가지고 있기 때문에, 큰 데이터 구조를 저장하는 데 적합합니다.

 

아래 문제를 참고.

 

[알고리즘] 1859. 백만 장자 프로젝트

0. 문제 D2 level SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 1. 제출 가. 실패 #include #include //#include using namespace std; int main(int argc, char** a

ramen4598.tistory.com

 


'Algorithm > with C++' 카테고리의 다른 글

[C++] fill, memset, memcpy  (0) 2023.07.08
[C++] iterator  (0) 2023.07.08
[C++] 배열과 포인터  (0) 2023.07.01
[C++] pair와 tuple  (0) 2023.07.01
[C++] string  (0) 2023.03.20