Tôi đang làm việc trên bộ cấp phát mmap cho phép vectơ sử dụng bộ nhớ từ tệp được ánh xạ bộ nhớ. Mục đích là để có vectơ sử dụng bộ nhớ 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 (> 10GB) vào bộ nhớ mà không có bản sao trên trên cao, do đó tôi cần trình phân bổ tùy chỉnh này.
Cho đến bây giờ, tôi có bộ khung phân bổ tùy chỉnh (có nguồn gốc từ std :: allocator), tôi cho rằng đây là điểm bắt đầu tốt để bắt đầu phân bổ của riêng mình. Hãy sử dụng đoạn mã này trong bất cứ cách nào bạn muốn:
#include <memory>
#include <stdio.h>
namespace mmap_allocator_namespace
{
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, khai báo một container 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 cho ví dụ để đăng nhập bất cứ khi nào bộ nhớ được phân bổ. Điều gì là cần thiết là cấu trúc rebind, khác container vector sử dụng các superclasses phân bổ/deallocate phương pháp.
Cập nhật: Bộ phân bổ ánh xạ bộ nhớ hiện khả dụng tại https://github.com/johannesthoma/mmap_allocator và là LGPL. Hãy sử dụng nó cho các dự án của bạn.
Nguồn
2012-09-21 11:06:30
Cảm ơn bạn đã liên kết thứ hai đó. Việc sử dụng các trình phân bổ để thực hiện các luồng riêng tư là thông minh. Tôi thích rằng đây là một ví dụ tốt về nơi các trình phân bổ tùy chỉnh có lợi thế rõ ràng trong một kịch bản không phải là tài nguyên giới hạn (nhúng hoặc bảng điều khiển). – Naaff
Liên kết ban đầu hiện không còn tồn tại, nhưng CiteSeer có PDF: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 –
Tôi phải hỏi: Bạn có thể di chuyển một cách đáng tin cậy như vậy không vào một chủ đề khác? (Tôi đoán là không) – sellibitze