আমি একটি এমএমএপি-বরাদ্দকারী নিয়ে কাজ করছি যা ভেক্টরকে মেমরি-ম্যাপযুক্ত ফাইল থেকে মেমরি ব্যবহার করতে দেয়। লক্ষ্যটি হ'ল এমএমএপ দ্বারা সরাসরি ভার্চুয়াল মেমরির মধ্যে থাকা স্টোরেজ ব্যবহারকারী ভেক্টর থাকে। আমাদের সমস্যাটি হ'ল সত্যিকারের বৃহত ফাইলগুলি (> 10 গিগাবাইট) মেমরিতে কোনও অনুলিপি ওভারহেড ছাড়াই উন্নত করা, সুতরাং আমার এই কাস্টম বরাদ্দক প্রয়োজন।
এখনও অবধি আমার কাছে কাস্টম বরাদ্দকারীর কঙ্কাল রয়েছে (যা এসটিডি :: বরাদ্দকারী থেকে উদ্ভূত), আমি মনে করি এটি নিজস্ব বরাদ্দ লেখার পক্ষে একটি ভাল সূচনা পয়েন্ট। কোডটি এই টুকরোটি আপনি যেভাবেই ব্যবহার করতে পারেন তা নির্দ্বিধায়:
#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() { }
};
}
এটি ব্যবহার করতে, নিম্নলিখিত হিসাবে একটি এসটিএল ধারক ঘোষণা করুন:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
এটি যখনই মেমরি বরাদ্দ করা হয় লগ করতে উদাহরণস্বরূপ ব্যবহার করা যেতে পারে। যা প্রয়োজনীয় তা হ'ল রিবাইন্ড স্ট্রাক্ট, অন্যথায় ভেক্টর ধারক সুপারক্লাস বরাদ্দ / ডিলোকেট পদ্ধতিগুলি ব্যবহার করে।
আপডেট: মেমরি ম্যাপিং বরাদ্দকারী এখন https://github.com/johannesthoma/mmap_allocator এ উপলব্ধ এবং এলজিপিএল। আপনার প্রকল্পের জন্য নির্দ্বিধায় এটি ব্যবহার করুন।