(C++ : Template) 기타) STL Memory Allocator

Posted by : at

Category : Cpp


// STL의 vector를 생각해 보자.
template<typename T> class vector
{
    T* buff;
public:
    void resize(int n)
    {
        // 버퍼 재할당이 필요하다면?
        // new?, malloc?, calloc? ... 뭘쓰나??
        // STL내부에는 메모리할당기를 제공한다.
    }
};

int main()
{
    vector<int> v(10);
    v.resize(20);
}
template<typename T> class allocator
{
public:
    T* allocator() {}
    void deallocate() {}
};

template<typename T, typename Ax = allocator<T>> class vector
{
    T* buff;
    Ax ax;
public:
    void resize(int n)
    {
        T* p = ax.allocate(n);
        ax.deallocate(p);
    }
};


int main()
{
    vector<int, MyAlloc<int>> v(10);        // 이런 선언이 가능하다.
    v.resize(20);
}

rebind

template<typename T> class allocator
{
public:
    T* allocate(int sz) { return new T[sz]; }
    void deallocate(T* p) { delete[] p; }

    tempate<typename U> struct rebind
    {
        typename allocator<U> other;
    }
};

// rebind
template<typename T, typename Ax = allocator<T>> class list
{
    struct NODE
    {
        T data;
        NODE* next, *prev;
    };
    //Ax ax;  // allocator<int> 버전임
    // 필요한거는 allocator<NODE>가 필요하다.
    
    // allocator<int>::rebind<NODE>::other ax;
    // allocator<NODE> ax;

    typename Ax::template rebind<NODE>::other ax;
public:
    void push_front(const T& a)
    {
        ax.allocate(1);
    }
};

int main()
{
    list<int> s;
    s.push_front(10);
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links