2016-07-25 6 views
0

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?

+0

Ehrlich, was denkst du? (Stellen Sie sich vor, dass 'malloc (10)' 6 Bytes zurückgibt, weil es nicht alle 10 Bytes benötigt ...) – Xarn

+3

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

+2

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

Antwort

4

Das STL-Modell, das C++ geerbt hat, basiert auf einer bestimmten Division zwischen Container und Zuordner. Der Zweck eines Zuweisers besteht darin, den von jemandem angeforderten Speicher bereitzustellen. Die Entscheidung darüber, wie viel Speicher zuzuweisen ist, hängt vollständig vom Container ab, ohne Rücksicht darauf, für welchen Zuordner er diesen Speicher bereitstellt.

Das ist das Modell C++ verwendet. Sie könnten Ihren eigenen vector -ähnlichen Container schreiben, der es seinem Zuordner ermöglicht anzugeben, wie viel er zuweisen soll. Aber sonst, nein.

Verwandte Themen