2008.07.14 05:06 책 정리/Effective STL
보통의 경우 메모리 할당은 new 나 malloc 으로 처리 한다. 하지만 좀더 상세하게 작동하고자 할 경우 할당자를 사용 한다고 하니, ... 일단 짚고 넘어가야겠다.

할당자(allocator)를 찾아봐도,
1. operator new 나 operator new[] 와 마찬가지로 메모리 할당과 해체를 해 주는 객체이다
2. 하지만 그 사용 방법이 전혀 다르다

3. 할당자에서 정의된 메모리의 모델의 포인터와 참조자에 typedef를 제공해야 한다.
4. 같은 타입의 할당자 객체는 동등하고, 상등 비교를 수행 한다. (같은 타입의 할당자는 똑같다는 말로 해석 됨)

5. 할당자는 상태를 갖지 않는다. (비정적(non-static) 데이터 멤버를 전혀 가지지 않는다.)
5번 사항으로 인하여, STL은 두 개의 할당자를 사용하려는 시도는 런타임 데이터 구조를 더렵힐수 있다고 경고한다. (.. 아마도 두 개의 할당자는 같은 할당자여서 그런게 아닐까 한다..)

6.  allocator<T>::allocate는 operator new 와 달리 매개변수로 확보하고자 하는 메모리 공간을 byte 단위가 아닌 객체의 갯수 단위를 인자로 같는다.
7. allocator<T>::allocate는 T* 를 반환하지만 실질적으로 T 를 가리키지 않고, 그 호출자가 T 책임진다고 한다.
(.. 7번은 잘 이해가 되지않고, operator new 와 .. 많이 다르다는 것으로 이해가 된다..)

8. Standard Containers 의 경우 Container 생성시, 할당자를 한번도 호출하지 않는다.
(무슨 뜻인지 모르겠다. )


다행이도 필자가 정리해준것이 있는데, 이런게 있다는것을 알아 두었다가 할당자에 대해서 다기 공부할때 익혀야 겠다.
1. 할당자를 템플릿으로 만든다.
2. pointer와 reference 라는 typedef 타입을 제공해야 한다.(물론 ... T* 나 T& 로)
3. 할당자에 객체별 상태를 절대로 주지 않는다.
4. 할당자의 allocate 멤버 함수에는 필요한 객체의 개수를 매개 변수로 넘긴다. 물론 이것은 T*을 typedef로 정의된 pointer 로 반환하되, T객체는 아직 생성된것이 아니라는 점은 기억해야 한다.
5. 표준 컨테이너에서 필요로 하는 rebine 라는 중첩 템플릿을 꼭 제공해야 한다.

이런 규칙이 있기 때문에.. 필자는 다른 영리한 사람이 만든 할당자 껍데기를 쓰라고 권유하고 있다.
1. 조스티스가 만든 할당자
2. 오스턴이 쓴 기사인 "What Are Allocators Good For?" 에 있는 할당자 껍데기

.. 어디 할당자를 어떻게 쓰는지 나타낸 책이라도 있으면 정말 보고 싶다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. jkg 2008.10.24 21:45  Addr  Edit/Del  Reply

    http://www.josuttis.com/cppcode/allocator.html

  2. jkg 2008.10.24 21:53  Addr  Edit/Del  Reply

    http://www.ddj.com/cpp/184403759?pgno=1