私の理解では、カスタム アロケーターは Allocator Conceptの要件に適合する必要があります。ただし、そのインターフェイスに基づいて、ベクトルが予約を使い果たしたときに新しい割り当て量を選択する方法がわかりません。
たとえば、私のマシンの現在の実装ではreserve
、push_back()
. 遅くてメモリを意識したカスタムアロケータを提供したいと思います。capacity+1
新しい要素に対応する ために以前のもののみを割り当てます。
これらは、私が見ている概念のインターフェースです。
a.allocate(n)
a.allocate(n, cvptr) (optional)
私は次のように定型的なアロケーターを作成しました:
#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);
}
};
関数を見るallocate
:
pointer allocate(size_type num, const void * = 0) {
return (pointer)(::operator new(num * sizeof(T)));
}
ここでメモリを多かれ少なかれ割り当てることはできますが、現在の容量が何であるかを認識できるように、それをベクトルに報告する方法がわかりません。
これはアロケータの責任範囲外ではないでしょうか?