보통의 경우 메모리 할당은 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?" 에 있는 할당자 껍데기
.. 어디 할당자를 어떻게 쓰는지 나타낸 책이라도 있으면 정말 보고 싶다.
할당자(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?" 에 있는 할당자 껍데기
.. 어디 할당자를 어떻게 쓰는지 나타낸 책이라도 있으면 정말 보고 싶다.
'책 정리 > Effective STL' 카테고리의 다른 글
항목 15 : 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을... (0) | 2008.07.16 |
---|---|
항목 14 : reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다. (1) | 2008.07.16 |
항목 13 : 동적으로 할당한 배열보다는 vector와 string 이 낫다. (0) | 2008.07.15 |
항목 12 : STL 컨테이너의 쓰레드 안전성에 대한 기대는 현실에 맞추어 가지자. (0) | 2008.07.15 |
항목 11 : 커스텀 할당자를 제대로 사용하는 방법을 이해하자. (0) | 2008.07.15 |
항목 9 : 데이터를 삭제할 때에도 조심스럽게 선택할 것이 많다. (0) | 2008.07.13 |
항목 8 : auto_ptr의 컨테이너는 절대로 만들지 말자. (0) | 2008.07.13 |
항목 7 : new로 생성한 포인터의 컨테이너를 사용할 대에는 컨테이너가 소멸되기 전에 포인터를 delete하는 일을 잊지 말자. (0) | 2008.07.13 |
항목 6 : C++ 컴파일러의 어이없는 분석 결과를 조심하자. (0) | 2008.07.13 |
항목 5 : 단일 요소를 단위로 동작하는 멤버 함수보다 요소의 범위를 단위로 동작하는 멤버 함수가 더 낫다. (0) | 2008.07.13 |
최근댓글