Nach meinem Verständnis muss ein benutzerdefinierter Zuordner den Anforderungen des Allocator Concept entsprechen. Basierend auf dieser Schnittstelle kann ich jedoch nicht sehen, wie ich einen neuen Zuweisungsbetrag wählen würde, wenn der Vektor keine Reserve mehr hat.Kann ich einen benutzerdefinierten Zuordner schreiben, um die Neuzuordnungsmenge von std :: vector zu bestimmen?
Zum Beispiel verdoppelt die aktuelle Implementierung auf meiner Maschine die Zuweisungsgröße jedes Mal, wenn die reserve
während einer push_back()
überschritten wird. Ich möchte einen benutzerdefinierten Zuordner bereitstellen, der langsam und speicherbewusst ist. Es wird nur die vorherige capacity+1
zuweisen, um das neue Element aufzunehmen.
Dies sind die Schnittstellen des Begriffs auf der ich suche:
#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);
}
};
Mit Blick auf die allocate
Funktion:
a.allocate(n)
a.allocate(n, cvptr) (optional)
ich eine Arbeits vorformulierten allocator wie so gemacht haben
Ich könnte hier mehr oder weniger Speicher reservieren, aber ich sehe keine Möglichkeit, das zu melden t zurück zum Vektor, damit er weiß, was seine aktuelle Kapazität ist.
Vielleicht fällt das nicht in die Verantwortung eines Allokators?
Ehrlich, was denkst du? (Stellen Sie sich vor, dass 'malloc (10)' 6 Bytes zurückgibt, weil es nicht alle 10 Bytes benötigt ...) – Xarn
IMHO, die Strategie, mehr als den in push_back benötigten Speicher zuzuweisen, ist eine Verantwortlichkeit der Vektorklasse . Der Zuordner hat die Verantwortung, die benötigte Speichermenge zu finden. – EFenix
Eigentlich würde ich Ihre Implementierung eine falsche Implementierung der Vektorklasse betrachten, da die Schnittstelle dieser Klasse die amortisierte O (1) Effizienz der Pushback-Methode enthält. – EFenix