그냥 게임개발자

프로세스 메모리 구조와 정적할당과 동적할당 본문

C++ 나만의 복습

프로세스 메모리 구조와 정적할당과 동적할당

sudoju 2024. 4. 7. 15:32

짜잔 메모리구조입니다.

귀엽죠

뭔가 알록달록 무지개 같음

위에서부터 스택(stack), 힙(heap), 데이터 영역(BSS segment, Data segment), 코드 영역(code segment)으로 나눠진다.

 

스택

지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정된다.

그러나 함수가 함수를 호출하는(재귀함수) 등 따라 런타임시에도 크기가 변경된다

 

힙은 동적 할당할 때 사용되며 런타임 시에 크기가 결정이 된다.

 

데이터 영역

BSS 영역과 Data 영역으로 나뉘고 정적할당에 관한 부분을 담당한다.

[정적인 특징]

코드 영역 : 소스코드 들어감 [정적인 특징]

 

 

 

정적할당

정적할당은 컴파일단계에서 메모리를 할당하는 것을 말한다.

BSS segment와 Data segment, code / text segment로 나뉘어서 저장됨

BSS segment전역변수, static, const로 선언되어 있는 변수 중 0으로 초기화 또는 초기화가 어떠한 값으로도 되어 있지 않은 변수들이 이 메모리 영역에 할당됩니다.

 

#incldue <iostream>

using namespace std;

int a;
int b = 0;
const int c = 0;

int main()
{
    static int d;
    static int e = 0;
    return 0;
}

 

Data segment전역변수, static, const로 선언되어 있는 변수 중 0이 아닌 값으로 초기화 된 변수가 이 메모리 영역에 할당됨

 

#include <iostream>

using namespace std;

int a = 1;
const int b = 2;

int main()
{
    static int c = 3;
    return 0;
}

 

code / text segment는 프로그램의 코드가 들어감

 

 

동적할당

동적할당은 런타임단계에서 메모리를 할당받는 것이며 Stack과 Heap으로 나눠진다.

 

 

Stack은 지역변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역이다.

함수가 호출될 때마다 환경 등 특정 정보가 stack에 계속해서 저장된다.

또한, 재귀함수가 호출된다고 했을 때 새로운 스택 프레임이 매번 사용되기 때문에 함수 내의 변수 집합이 해당 함수의 다른 인스턴스 변수를 방해하지 않는다.

이게 뭔 말이냐면 재귀함수 내의 지역변수로 선언하게 되면 해당 변수는 독립적으로 작용해서 다른 함수에 있는 변수에 영향을 끼치지 않는다는 말이다.

 

Heap은 동적으로 할당되는 변수들을 담는다.

malloc(), free()함수를 통해 관리할 수 있다.

많이 들어보지 않았나 malloc, free근데 이거 이제 잘 안쓴다.

가끔씩 쓰긴한다.

동적으로 관리되는 자료구조의 경우 Heap 영역을 사용한다.

뭐 예를 들어 vector는 내부적으로 heap영역을 사용한다.

 

'C++ 나만의 복습' 카테고리의 다른 글

이터레이터와 포인터의 차이  (0) 2024.04.07
이터레이터!  (0) 2024.04.07
문자를 숫자로, 숫자를 문자로  (0) 2024.04.07
unique()  (0) 2024.04.07
역참조 연산자  (0) 2024.04.05