38-2-바.할당기

이상으로 STL을 구성하는 컨테이너, 반복자, 알고리즘 등 주요 3요소에 대해 앞 절에서 간단하게나마 소개했고 또 함수 객체와 어댑터에 대해서는 비교적 상세하게 연구해 보았다. 아마 여기까지 읽었으면 STL이 엄청나게 복잡하다고 느껴질텐데 다행히 다음 장부터는 그리 어렵지 않다. STL을 구성하는 나머지 한 요소는 메모리를 관리하는 할당기(Allocator)라는 것인데 간단하게 소개만 하기로 한다.

벡터, 리스트, 맵, 셋 등 STL 컨테이너의 저장 가능한 최대 요소 개수에는 제한이 없다. 요소가 삽입되면 필요할 때마다 메모리를 추가 할당하는데 이 과정은 컨테이너 내부에 완전 자동화 되어 있어 사용자가 신경쓰지 않아도 된다. 컨테이너들은 메모리 할당만을 전문적으로 관리하는 할당기 객체를 가지는데 보통 컨테이너의 템플릿 인수로 전달된다. 다음은 벡터 템플릿의 선언문이다.

 

template <class Type, class Allocator = allocator<Type> > class vector

 

첫 번째 인수로 요소의 타입을 지정하며 두 번째 인수로 할당기를 지정하는데 할당기에는 디폴트가 있다. Type형에 대한 디폴트 할당기는 allocator<Type>이며 Type형의 자료를 저장하기 위한 메모리 관리를 담당한다. 메모리 할당 방식은 여러 가지가 있는데 디폴트 할당기는 C++의 new, delete 연산자를 사용한다. 만약 다른 방식으로 메모리를 직접 관리하고 싶다면 디폴트 할당기가 아닌 직접 만든 할당기를 사용할 수도 있다.

예를 들어 malloc/free를 사용할 수도 있고 COM 인터페이스를 쓸 수도 있고 운영체제의 가상 메모리를 직접 다룰 수도 있다. 할당기를 직접 만들어 쓰는 가장 실용적인 예는 할당, 해제가 아주 빈번하며 필요량이 많을 때 메모리를 미리 왕창 할당하여 메모리 풀을 만들어 놓고 이 메모리를 내부에서 관리하며 번갈아 쓰도록 할 때이다. 운영체제의 간섭에서 벗어나 메모리에 대한 완전한 통제권을 행사하고 싶을 때 이런 방법이 동원된다.

그러나 현실적으로 직접 할당기를 만들어 써야만 하는 예를 찾기는 무척 어렵다. 운영체제의 메모리 관리 능력이 향상되어 충분히 신뢰할만하며 쫀쫀하게 메모리를 아껴 써야 할만큼 시스템 자원이 부족하지도 않기 때문이다. 할당기라는 것이 과거 16비트 시절 세그먼트/오프셋 같은 복잡한 메모리 구조를 추상화하기 위한 목적으로 만들어진 것이라 지금은 사용자가 정의할 이유가 딱히 없는 셈이다.

설사 만들어 보고 싶다고 하더라도 기존의 STL 컴포넌트와 완벽하게 잘 조화되는 할당기를 만드는 것이 그다지 간단하지 않음을 직감적으로 느낄 수 있을 것이다. 특별한 이유가 없는 한 디폴트만 사용해도 충분하다. 여기서는 할당기도 STL의 구성 요소중 하나이고 꼭 원할 경우 교체 가능하다는 정도만 상식적으로 알아 두자.