할당을 위해선 보통 아래 두 가지 방법 중 하나를 사용한다.
- automatic allocation
: 스택에 할당한다.
- dynamic allocation
: 힙에 할당한다.
스택에 할당하는 것과 힙에 할당하는 것은 각각 특징이 있다.
스택에 할당 (Stack Allocation)
- 메모리 할당을 순차적으로 한다.
- 메모리를 역순으로 해제한다. (FILO : First In Last Out)
- 할당될 메모리의 크기를 컴파일러가 알고있어 메모리를 할당하고 해제할 때 컴파일러에서 정의된 routine을 따라 수행된다.
- 다음 할당될 주소가 implicit하기 때문에 빠르게 할당하고 해제할 수 있다.
- 새로운 scope에 들어가면 자동으로 구분하여 할당한다(automatic storage). scope을 벗어나면 자동으로 해당 블록의 변수를 해제한다(flush automatically).
- 힙 메모리에 비해 저장 공간이 적다.
- C++에선 RAII라는 기술을 이용하여 자원의 lifetime과 객체의 lifetime을 일치시켜 자원을 관리할 수 있다. (자원을 객체로 wrapping한다.)
- 실제로 std::string 클래스를 이용하여 객체를 생성하면 정해진 메모리 크기가 아닌 다양한 크기의 메모리를 할당한다.
다양한 크기의 메모리를 할당하지만 자원을 수동으로 관리하지 않아도돼서 동적 할당의 이점을 이용할 수 있다.
힙에 할당 (Heap Allocation)
- 유연한 메모리 할당을 할 수 있다.
- 할당할 크기와 언제까지 사용할 지 모르기때문에 할당이 느리다.
- delete, delete [] 를 이용해 메모리를 수동으로 해제해야한다.
- 해제하는 순간을 모르기 때문에 유연할 수 있다.
- 자료구조 힙과는 관련없다. '무엇인가를 차곡차곡 쌓아올린 더미'라는 뜻으로 힙이라고 불린다.
- 힙 메모리에 할당되지만 객체에 대한 참조 정보는 스택에 생성된다.
- 힙에 할당된 변수는 스레드 간 공유될 수 있으므로 스택에 할당하는 것이 더 안전한다.
- 프로그래머가 해제를 수동으로 해줘야하고, 잘 처리하지 못하면 메모리 leak이 발생할 수 있다.
힙에 할당해야 하는 경우
힙을 사용하면 스택을 사용하는 것보다 더 느리고 메모리를 수동으로 해제해줘야한다는 단점이 있지만 동적 할당(힙 할당)을 하는 것이 더 유용한 상황이 있다.
참조 1
참조 2