Saya bekerja pada pengalokasi mmap yang memungkinkan vektor untuk menggunakan memori dari file yang dipetakan memori. Tujuannya adalah untuk memiliki vektor yang menggunakan penyimpanan yang langsung di memori virtual yang dipetakan oleh mmap. Masalah kami adalah meningkatkan pembacaan file yang sangat besar (> 10GB) ke dalam memori tanpa overhead salinan, oleh karena itu saya memerlukan pengalokasi khusus ini.
Sejauh ini saya memiliki kerangka pengalokasi khusus (yang berasal dari std :: pengalokasi), saya pikir itu adalah titik awal yang baik untuk menulis pengalokasi sendiri. Jangan ragu untuk menggunakan kode ini dengan cara apa pun yang Anda inginkan:
#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() { }
};
}
Untuk menggunakan ini, nyatakan wadah STL sebagai berikut:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
Sebagai contoh, dapat digunakan untuk mencatat kapan saja memori dialokasikan. Apa yang diperlukan adalah struct rebind, atau wadah vektor menggunakan metode alokasi / deallocate superclasses.
Pembaruan: Pengalokasi pemetaan memori sekarang tersedia di https://github.com/johannesthoma/mmap_allocator dan merupakan LGPL. Jangan ragu untuk menggunakannya untuk proyek Anda.