필요 사전 지식
<C++ 기초> 메모리 동적 확보, 배열의 동적인 확보
C++ 는 사용자가 메모리 관리를 직접 해 주어야 하는 Unmanaged Language이다.
메모리 관리에 실패하게 되면 Memory leak, Memory fragmentation 등의 문제가 일어날 수 있다.
힙 메모리를 정확하게 이해한다면 이런 문제들을 피해 프로그래밍을 할 수 있다.
Stack VS Heap 비교하기
1. stack 스택 메모리
1) 메모리가 스택 프레임 단위로 쌓여간다.
2) 컴퓨터는 변수를 찾기 위해, 탑 위치로부터 몇 번째로 인식하여 메모리 공간에 접속
3) 접속한 공간에 주소가 있다면, 그 주소를 타고 다른 공간으로 가는 식으로 메모리 관리.
4) 메모리가 쌓일 때는 그냥 올리기만 하면 되고, 해제할 때는 가장 위에를 없애주기만 하면 된다. (Push/Pop)
5) 전반적으로 매우 간단한 메모리 구조를 가진다.
https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D
2. heap 힙 메모리
1) 쌓여가는 느낌이 아니라 순서 없이 더미로 있는 느낌.
2) 힙 메모리를 관리하기 위해서는 스택의 어느 공간의 포인터(주소) 정보를 가지고 있고,
그 포인터가 힙 메모리의 어떤 공간을 가리키는 방식으로 메모리 관리를 해주게 된다.
예시)
line 5) 포인터 Int ip 공간을 만든다.
line 6) 힙 공간에 int size (4byte) 만큼 할당 받는다. stack의 포인터 ip 는(주소는) 이 할당받은 힙 공간을 가리키고 있다.
line 7) 이 ip 가 가리키고 있는 공간에 100이라는 숫자를 할당한다.
현재 ip는 스택에서 첫 번째에 있는데, 이 ip포인터가 가리키는 공간을 따라가서 100을 넣었다는 의미.
line 8) delete ip 명령 실행하여 할당되어 있는 힙 메모리를 삭제.
line10) 프로그램이 끝나면서, 스택 프레임이 해제되며 프로그램 종료.
왜 힙 메모리를 사용해야 하는가?
3가지 이유
1) Life Cycle
2) Large Size
3) Dynamic (Runtime)
1) Life Cycle 문제
스택 메모리는 쌓이고 해제하는 방식이다. 앞선 글에서 설명했듯, 스택 프레임은 함수 단위로 쌓이고 사라진다. 흔히 말하는 지역변수, 매개변수가 여기에 모두 해당된다. 함수가 끝나면 이 데이터들은 반환값을 따로 저장해주지 않는 이상 모두 사라지게 된다.
간단히 예를 들어, 어떤 데이터를 스택 메모리 위에 올려놨는데 함수가 끝나면서 그 파트가 사라지게 되면 저장했던 데이터가 모두 날아가게 되는 것이다! 이 때, 만약 데이터를 스택 메모리 위에 올려놓는 것이 아니라 힙 메모리 상에 데이터를 넣어놓고 포인터로 힙 메모리를 가리키는 방식으로 프로그래밍을 했다면 이 문제는 자연스럽게 해결된다.
이렇게 힙 메모리는 포인터만 신경 써주면 되기 때문에 메모리 관리가 쉽고 Life Cycle 문제가 해결 가능하다.
2) Large Size 문제
상당히 큰 메모리가 필요한 경우에, 스택 메모리에는 한계가 있기 때문에 스택을 계속 쌓아 나갈 수는 없다.
이 때, 스택을 하나 가볍게 쌓아 놓고 포인터를 만들고, 힙 메모리 공간에 엄청나게 큰 메모리를 차지하는 object를 만들어 놓고 이것을 가리키게 만드는 방식으로 프로그래밍 하면 사이즈는 문제가 되지 않는다.
즉, 포인터만 패스해 주는 방식으로 데이터를 다루게 되면 커다란 오브젝트를 힙에서 관리함으로써 이 문제도 해결 가능하다.
3) Dynamic (runtime size) 문제
스택 프레임 Stack Frame 은 모두가 컴파일 시간에 결정된다.
변수 Int 등이 몇 개 필요할지 등은 모두 컴파일 시간에 정해진다는 것이다.
하지만 프로그램을 실행하게 된 후에야 알 수 있는, 미리 알 수 없는 정보들이 있다.
간단한 예시로, 사용자가 고양이 object를 10마리 필요하게 될지 20마리가 필요하게 될지는 미리 알 수 없는 정보이다.
힙을 사용하게 되면 포인터만 가지고 메모리 공간을 할당받을 수 있는데, 프로그램 실행 과정에서 고양이 object를 5마리 만들지 10마리 만들지 자유롭게 결정할 수 있다.
'모던C++ > 메모리 구조 Memory Structure' 카테고리의 다른 글
7. 힙 스택 스태틱 Heap Stack Static - 언제 어떻게 사용해야 할까 (0) | 2022.07.06 |
---|---|
6. 힙 메모리 Heap Memory 에 대한 모든 것 (2) - 예제 + Memory Leak 메모리 릭 방지 (0) | 2022.07.01 |
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 |