제 생각에 사용자 지정 할당자는 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)));
}
여기에 메모리를 더 할당 할 수도 있지만보고 할 수있는 방법이 없습니다. 벡터로 돌아가서 현재 용량이 무엇인지를 알 수 있습니다.
어쩌면 이것은 할당 자의 책임 밖일 수 있습니까?
솔직히, 어떻게 생각하세요? (당신이 10 바이트를 모두 필요로하지 않는다고 생각하기 때문에'malloc (10)'이 6 바이트를 반환한다고 상상해보십시오 ...) – Xarn
IMHO, push_back에 필요한 메모리 이상을 할당하는 전략은 벡터 클래스의 책임입니다 . 할당자는 필요한 메모리 양을 찾을 책임이 있습니다. – EFenix
사실,이 클래스의 인터페이스에는 push_back 메서드의 amortized O (1) 효율성이 포함되어 있으므로 구현에서 벡터 클래스를 잘못 구현 한 것으로 간주합니다. – EFenix