1

私の理解では、カスタム アロケーターは Allocator Conceptの要件に適合する必要があります。ただし、そのインターフェイスに基づいて、ベクトルが予約を使い果たしたときに新しい割り当て量を選択する方法がわかりません。

たとえば、私のマシンの現在の実装ではreservepush_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)));
}

ここでメモリを多かれ少なかれ割り当てることはできますが、現在の容量が何であるかを認識できるように、それをベクトルに報告する方法がわかりません。

これはアロケータの責任範囲外ではないでしょうか?

4

1 に答える 1

5

C++ が継承した STL モデルは、コンテナーとアロケーターの間の特定の分割に基づいています。アロケータの目的は、誰かが要求したメモリを提供することです。どのアロケータを使用してそのメモリを提供するかに関係なく、割り当てるメモリの量は完全にコンテナ次第です。

これが C++ が使用するモデルです。アロケータが割り当てる量を指定できる独自の のvectorようなコンテナを作成できます。しかし、それ以外はありません。

于 2016-07-25T20:49:47.810 に答える