Tôi đang làm việc trên một bộ cấp phát mmap cho phép các vectơ sử dụng bộ nhớ từ một tệp ánh xạ bộ nhớ. Mục tiêu là có các vectơ sử dụng bộ lưu trữ trực tiếp trong bộ nhớ ảo được ánh xạ bởi mmap. Vấn đề của chúng tôi là cải thiện việc đọc các tệp thực sự lớn (> 10 GB) vào bộ nhớ mà không cần chi phí sao chép, do đó tôi cần bộ cấp phát tùy chỉnh này.
Cho đến nay tôi có bộ xương của một bộ cấp phát tùy chỉnh (xuất phát từ std :: allocator), tôi nghĩ rằng đó là một điểm khởi đầu tốt để viết các bộ cấp phát riêng. Hãy sử dụng đoạn mã này theo bất cứ cách nào bạn muốn:
#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() { }
};
}
Để sử dụng, hãy khai báo một thùng chứa STL như sau:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
Nó có thể được sử dụng ví dụ để ghi nhật ký bất cứ khi nào bộ nhớ được phân bổ. Cái gì là cần thiết là cấu trúc rebind, khác với container vector sử dụng các phương thức phân bổ / giải quyết siêu lớp.
Cập nhật: Trình phân bổ ánh xạ bộ nhớ hiện có sẵn tại https://github.com/johannervationoma / mmap_allocator và là LGPL. Hãy sử dụng nó cho các dự án của bạn.