2016-07-25 2 views
0

제 생각에 사용자 지정 할당자는 Allocator Concept의 requierements에 맞아야합니다. 해당 인터페이스를 기반으로하지만, 내가 벡터 할당량이 부족할 때 새로운 할당량을 선택하는 방법을 볼 수 없습니다.std :: vector의 재 할당 량을 결정하기 위해 사용자 정의 할당자를 쓸 수 있습니까?

예를 들어, 내 컴퓨터의 현재 구현은 reserve이 초과 될 때마다 push_back() 동안 할당 크기를 두 배로 늘립니다. 느리고 메모리를 의식하는 사용자 정의 할당자를 제공하고 싶습니다. 이전 요소 인 capacity+1 만 할당하여 새 요소를 수용합니다. allocate 기능을 살펴보면

#include <limits> 
#include <iostream> 

template <class T> class MyAlloc { 
public: 

    // type definitions 
    typedef T value_type; 
    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; 

    pointer address(reference value) const { 
    return &value; 
    } 
    const_pointer address(const_reference value) const { 
    return &value; 
    } 
    size_type max_size() const throw() { 
    return std::numeric_limits<std::size_t>::max()/sizeof(T); 
    } 
    pointer allocate(size_type num, const void * = 0) { 
    return (pointer)(::operator new(num * sizeof(T))); 
    } 
    void construct(pointer p, const T &value) { 
    new ((void *)p) T(value); 
    } 
    void destroy(pointer p) { 
    p->~T(); 
    } 
    void deallocate(pointer p, size_type num) { 
    ::operator delete((void *)p); 
    } 
}; 

: 나는 작업 보일러 할당과 같이했습니다

a.allocate(n) 
a.allocate(n, cvptr) (optional) 

:

내가 찾고 있어요 개념의 인터페이스입니다

pointer allocate(size_type num, const void * = 0) { 
    return (pointer)(::operator new(num * sizeof(T))); 
} 

여기에 메모리를 더 할당 할 수도 있지만보고 할 수있는 방법이 없습니다. 벡터로 돌아가서 현재 용량이 무엇인지를 알 수 있습니다.

어쩌면 이것은 할당 자의 책임 밖일 수 있습니까?

+0

솔직히, 어떻게 생각하세요? (당신이 10 바이트를 모두 필요로하지 않는다고 생각하기 때문에'malloc (10)'이 6 바이트를 반환한다고 상상해보십시오 ...) – Xarn

+3

IMHO, push_back에 필요한 메모리 이상을 할당하는 전략은 벡터 클래스의 책임입니다 . 할당자는 필요한 메모리 양을 찾을 책임이 있습니다. – EFenix

+2

사실,이 클래스의 인터페이스에는 push_back 메서드의 amortized O (1) 효율성이 포함되어 있으므로 구현에서 벡터 클래스를 잘못 구현 한 것으로 간주합니다. – EFenix

답변

4

C++에서 상속받은 STL 모델은 컨테이너와 할당 자 사이의 특정 구분을 기반으로합니다. 할당 자의 목적은 누군가 요청하는 메모리를 제공하는 것입니다. 얼마나 많은 메모리를 할당할지에 대한 결정은 그 메모리를 제공하기 위해 어떤 할당자를 사용하는지에 관계없이 콘테이너에 달려있다.

이것은 C++에서 사용되는 모델입니다. 당신은 자신의 vector과 같은 컨테이너를 작성할 수있다.이 콘테이너는 할당자가 할당해야하는 양을 지정할 수있다. 하지만 그 외에는 안돼.