2014-07-22 1 views
5

Ich möchte eine std::vector Objekte haben, mit den Objekten unter Verwendung boost::pool zugeordnet. Ist so etwas korrekt:Mit boost :: pool, um die Speicherzuweisungen in einem std :: vector zu verwalten

class MyClass 
{ 
private: 
    double data; 
public: 
    MyClass(double d) : data(d) { } 
}; 

int main() 
{ 
    std::vector<MyClass, boost::fast_pool_allocator<MyClass> > vect; 
    vect.push_back(4.5); 
    vect.push_back(9.8); //Are these being stored in a pool now? 

    return 0; 
} 

Dieser Code funktioniert, aber ich bin mir nicht ganz sicher warum. Ich bin ziemlich neu im Konzept der Allokatoren, aber wenn ich richtig verstehe, sagt dies std::vector, um einen Pool anstelle des Standard-Allokators zu verwenden, so dass alle im Vektor erstellten Elemente aus einem Pool erstellt werden.

Was ich bin mir nicht ganz sicher ist:

Wo ist der Pool?

Und wie würde ich direkt auf den Pool zugreifen (um zum Beispiel Speicher freizugeben)?

Enthält fast_pool_allocator einen Pool, oder muss ich den Pool separat erstellen und dem Zuordner irgendwie mitteilen, ihn zu verwenden?

+1

Sie könnten z.B. [Diese 'std :: vector' Referenz] (http://en.cppreference.com/w/cpp/container/vector). Ich bin sicher, dass Sie eine geeignete Funktion finden können, um den Allokator zu bekommen. Vielleicht möchten Sie auch die ['std :: vector' Konstruktoren] (http://en.cppreference.com/w/cpp/container/vector/vector) auschecken. –

+1

Die [Boost-Referenz] (http://www.boost.org/doc/libs/1_55_0/libs/pool/doc/html/boost/fast_pool_allocator.html) sagt, 'boost :: pool_allocator' mit' std: : Vektor'. –

Antwort

3

Im Fall von boost::fast_pool_allocator ist der Pool ein Singleton im Besitz der Allokator-Implementierung. Sie müssen also nichts extra erstellen.

Sie können den Zuordner über get_allocator Funktion std::vector zugreifen, oder Sie können statische Funktionen in boost::fast_pool_allocator verwenden.

3

Mit Blick auf die boost reference gibt es eine Singleton-Instanz des Allokators, der von allen verwendet wird. Sie können damit sowohl Speicher reservieren als auch freigeben, indem Sie einfach ein lokales Objekt boost::fast_pool_allocator oder boost::pool_allocator erstellen.

Verwandte Themen