Ich arbeite an einem mmap-Allokator, mit dem Vektoren Speicher aus einer Speicherzuordnungsdatei verwenden können. Das Ziel besteht darin, Vektoren zu haben, die Speicher verwenden, die sich direkt im virtuellen Speicher befinden, der von mmap zugeordnet wird. Unser Problem besteht darin, das Lesen wirklich großer Dateien (> 10 GB) ohne Kopieraufwand in den Speicher zu verbessern. Daher benötige ich diesen benutzerdefinierten Allokator.
Bisher habe ich das Grundgerüst eines benutzerdefinierten Allokators (der von std :: allocator abgeleitet ist). Ich denke, es ist ein guter Ausgangspunkt, um eigene Allokatoren zu schreiben. Fühlen Sie sich frei, diesen Code so zu verwenden, wie Sie möchten:
#include <memory>
#include <stdio.h>
namespace mmap_allocator_namespace
{
// See StackOverflow replies to this answer for important commentary about inheriting from std::allocator before replicating this code.
template <typename T>
class mmap_allocator: public std::allocator<T>
{
public:
typedef size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
template<typename _Tp1>
struct rebind
{
typedef mmap_allocator<_Tp1> other;
};
pointer allocate(size_type n, const void *hint=0)
{
fprintf(stderr, "Alloc %d bytes.\n", n*sizeof(T));
return std::allocator<T>::allocate(n, hint);
}
void deallocate(pointer p, size_type n)
{
fprintf(stderr, "Dealloc %d bytes (%p).\n", n*sizeof(T), p);
return std::allocator<T>::deallocate(p, n);
}
mmap_allocator() throw(): std::allocator<T>() { fprintf(stderr, "Hello allocator!\n"); }
mmap_allocator(const mmap_allocator &a) throw(): std::allocator<T>(a) { }
template <class U>
mmap_allocator(const mmap_allocator<U> &a) throw(): std::allocator<T>(a) { }
~mmap_allocator() throw() { }
};
}
Um dies zu verwenden, deklarieren Sie einen STL-Container wie folgt:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
Es kann zum Beispiel verwendet werden, um zu protokollieren, wann immer Speicher zugewiesen wird. Notwendig ist die Rebind-Struktur, andernfalls verwendet der Vektorcontainer die Zuordnungs- / Freigabemethoden der Oberklassen.
Update: Der Speicherzuordnungszuweiser ist jetzt unter https://github.com/johannesthoma/mmap_allocator verfügbar und ist LGPL. Fühlen Sie sich frei, es für Ihre Projekte zu verwenden.