본문 바로가기
Programming/Tips(C++,C#)

할당자

by 곰네Zip 2014. 10. 30.

사용자 지정 할당자 예 

#include <limits>
#include <iostream>

namespace MyLib{
  template <class T>
  class MyAlloc{
  public:
     //type정의
     typedef T   value_type;   //원소의 타입 allocator<T>와 동일
     typedef T*   pointer;   //원소의 포인터에 대한 타입
     typedef const T* const_pointer;  //상수 포인터에 대한 타입
     typedef T&   reference;   //원소의 레퍼런스에 대한 타입
     typedef const T& const_reference; //원소의 상수레퍼런스에 대한 타입
     typedef std::size_t size_type;   //가장 큰 객체의 사이즈를 표기하기 위한 타입
     typedef std::ptrdiff_t difference_type; //두 포인터의 거리를 표현하기 위한 타입

     //rebind allocator type U
     template <class U>
     struct rebind{     //어떠한 할당자도 간접적으로 다른 타입의 기억 장소를 할당해 주는 기능을 제공
        typedef MyAlloc<U> other;
     }

     //return address of values
     pointer address( reference value) const { //상수값에 대한 포인터 반환
        return &value;
     }
     const_pointer address( const_reference value) const { //비상수값에 대한 포인터 반환
       return &value;
     }

     //생성자와 소멸자.
     //할당자는 상태가 없으므로 아무것도 안한다.
     MyAlloc() throw() {}     //기본 생성자
     MyAlloc(const MyAlloc&) throw() {}  //복사 생성자
     template <class U>
     MyAlloc(const MyAlloc<U>&) throw() {}
     ~MyAlloc() throw() {}     //소멸자

     size_type max_size() const throw() { //할당가능한 최대 원소 수 반환
        return std::numeric_limits<std::size_t>::max() / sizeof(T);
     }

     pointer allocate(size_type num, const void* = 0){ //T타입의 원소들을 할당은 하나 초기화는 안함
        std::cerr << "allocate " << num << " element(s)" << " of size " << sizeof(T) << std::endl;
        pointer ret = (pointer)(::operator new(num*sizeof(T)));
        std::cerr << "allocated at : " << (void*)ret << std::endl;
        return ret;
     }

     void construct(pointer p, const T& value){ //p가 참조하는 원소를 value로 초기화
        new((void*)p)T(value);
     }

     void destroy(pointer p){ //기억장소의 해제 없이 p가 참조하는 객체소멸. (객체의 소멸자 호출)
        p->~T();
     }

    void deallocate(pointer p, size_type num){ //p가 참조하는 기억 장소를 해제
       std::cerr << "deallocate " << num << " element(s) of size " << sizeof(T) << " at : " << (void*)p << 

     std::endl;
       ::operator delete((void*)p);
    }
  };

  template <class T1, class T2>
  bool operator== (const MyAlloc<T1>&, const MyAlloc<T2>&) throw() {
      return true;
  }

  template <class T1, class T2>
  bool operator!= (const MyAlloc<T1>&, const MyAlloc<T2>&) throw() {
     return false;
  }
}; 

 

반응형

댓글