프로세스 메모리 구조는 이런 식으로,
스택과 같은 경우는 위쪽에서부터 촘촘하게 아랫방향으로 진행되고,
힙은 아래쪽에서 위 방향으로 채워져 올라가는데 힙 메모리의 특성상 중간중간에 비어 있을 수 있다.
프로그램의 실행 과정 중에서 새로운 공간을 할당받고, 이미 할당받은 메모리가 해제되면서 빈 공간이 생기기 때문이다.
앞선 챕터들에서 힙과 스택 메모리의 장단점과 특징, 그리고 그 차이점에 대해 알아보았다.
정리해보면,
Stack 스택 메모리는
1) stack frame 스택 프레임 단위로 할당 해제가 된다.
2) 할당 해제의 위치는 항상 탑 위치에서부터 일어나게 된다. (위 프로세스 메모리 뷰 위쪽)
Heap 힙 메모리는
1) 새로운 메모리 공간을 받기 위해 힙 공간 중간에 어느 파트가 비어 있는지 확인해야 되고 어느 정도의 공간이 필요한지 결정해야 하는데 이는 모두 런타임(프로그램 실행 과정) 중에 일어난다.
2) 멀티 쓰레드 프로그래밍을 하게 되면 여러 가지 스레드가 힙 메모리에 접근 권한을 가지게 되는데, 그때 더 복잡한 방식으로 메모리 할당 해제가 발생한다.
3) 그렇기 때문에 메모리 할당 해제 시간이 스택에 비해 느릴 수 밖에 없다.
4) Dynamic Allocation 동적 할당이 가능하다. - 프로그램 실행 과정 중에 결정 가능.
5) 스택 같은 경우에는 불가능하니까, 힙이 더 유연한 메모리 관리를 해준다는 것.
6) Stack Overflow - 너무 큰 object나 큰 array를 allocation 시키게 된다면 엄청나게 큰 메모리를 할당받아야 하는데, 이 파트에서 스택이 컨트롤할 수 있는 한계를 넘어서게 되면 stack overflow 가 나면서 프로그램이 멈춰 서게 된다. 따라서 큰 사이즈의 경우에는 힙에 할당해 주어야 한다. (Large Size 문제)
언제 힙 메모리를, 스택 메모리를 사용해야 될까?
1) int double float 일반적인 변수들은 stack에 할당시켜 주는 것이 맞다.
: 굳이 시간을 더 들이며 힙에 할당해 줄 필요가 없다는 의미.
2) array의 경우 5개 200개 정도까지는 stack에 올려주는 것이 맞고, 그보다 큰 크기는 Heap에 할당해 주는 것이 좋다.
3) 몇백kb 또는 2mb 부터는 힙 메모리를 사용해 주는 것이 맞는 방향이다.
std::array<int,300> a; //1.2kb
std::array <int,500000> b; //2mb 니까 array 대신 vector를 사용해 주면 된다.
std::vector <int> b(500000)
4) class 등 object의 경우 위에서처럼 용량에 따라 heap stack 할당을 결정해 주면 된다.
: *java의 경우 new 사용해서 object를 생성하는 것에 익숙해져 있는데,
C++의 경우에는 object를 100개를 생성하더라도 총용량이 몇 mb 미만이라면 stack에 할당해 주는 것이 맞다.
(예제1)
오브젝트 동적 할당을 사용하는데, 퍼포먼스를 중시한(=빠른 반응속도)한 객체 Cat를 만들고 싶은 경우
count에 적절한 숫자, 예를 들어 1000을 넣고, foo() 함수에서 고양이에 대한 계산을 할 수 있다.
일반적인 경우 이렇게 하지만, 만약 퍼포먼스가 중요한, 매우 빠른 계산이 필요하다고 가정한다면 foo() 함수 콜 할 때마다 힙 공간에 할당을 매번 받고 다시 리턴해 주어야 하기 때문에 느린 계산이 된다.
이럴 경우엔 밑의 경우와 같이 bar() 함수를 통해 고양이 1000마리 정도를 미리 만들어 주고, 넘어온 숫자가 1000개 이상이면 바로 False. 이렇게 새로운 힙 메모리 할당 해제하는 시간도 아깝다면, 함수 안에서 array를 사용해서 스택으로 미리 1000마리의 cat을 만들어 놓고 적절한 숫자가 넘어오면 계산하도록 만들어 주면 빠른 계산을 할 수 있다.
static(global)
메모리 주소를 보면, 프로세스 뷰에서 맨 아래쪽이 가장 낮은 숫자인 것을 고려해 보았을 때
static 메모리는 힙 메모리 아래쪽에 존재함을 알 수 있다.
즉, static(global) 변수는 메모리 프로세스에서 힙 아래 부분을 사용하게 된다.
또한 static 메모리는 프로세스 실행과 동시에 static 파트는 할당된다.
참고: https://nybot-house.tistory.com/9?category=843727
'모던C++ > 메모리 구조 Memory Structure' 카테고리의 다른 글
6. 힙 메모리 Heap Memory 에 대한 모든 것 (2) - 예제 + Memory Leak 메모리 릭 방지 (0) | 2022.07.01 |
---|---|
5. 힙 메모리 Heap memory 에 대한 모든 것 - Heap vs Stack (0) | 2022.06.30 |
4. 스택 메모리 - 스택 프레임 Stack Frame, Call Stack, this (0) | 2022.06.16 |
3. 메모리 속 변수 타입 Variable Types - Struct, class, 포인터의 크기 (0) | 2022.06.16 |
2. 메모리 속 변수 타입 Variable Types - sizeof(), Array, Pointer, int... (0) | 2022.06.16 |
1. 메모리 속 변수들에 대한 설명 - Stack 스택 (0) | 2022.06.16 |