그냥 게임개발자
프로세스 메모리 구조와 정적할당과 동적할당 본문
짜잔 메모리구조입니다.
귀엽죠
뭔가 알록달록 무지개 같음
위에서부터 스택(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 |