Я реализовал пул памяти на основе стандартного интерфейса C ++.
template <typename T, size_t Cap = 8>
class SingularAllocator {
// member declarations ...
public:
inline SingularAllocator(); // Constructor.
inline ~SingularAllocator(); // Destructor.
inline T* allocate(const size_t n=1) ; // Allocate an entry of type T.
inline void deallocate(T*, const size_t n=1); // Deallocate an entry of type T.
template <typename... ArgsT>
inline void construct(T*, ArgsT&&...); // Construct an item.
inline void destroy(T*); // Destroy an item.
private:
thread_local Mempool _slot;
// member implementations ...
}
Для простоты приведенный фрагмент показывает только интерфейс. Идея состоит в том, чтобы использовать thread_local
ключевое слово, чтобы включить пул памяти для каждого потока. Мой вопрос, как я могу использовать это, чтобы каждый boost::variant
объект создан из моего пула? Для STL как std::vector
, это довольно просто, так как аргумент шаблона занимает дополнительное поле распределителя. Тем не менее, я не видел этого в boost::variant
,
boost::variant<int, string, OtherClass> MyStuf; // How to create this variant from my memory pool (per-thread).
Задача ещё не решена.
Других решений пока нет …