#include #include template class FixedAllocator { PageAllocator *page_allocator_; public: explicit FixedAllocator(std::uint64_t page_size) { _page_size = page_size; page_allocator_ = new PageAllocator(sizeof(Tp) * page_size); } Tp *Allocate() { if (_free_pool.empty()) { Tp *next = static_cast(page_allocator_->Allocate()); for (int i = 0; i < _page_size; ++i) { _free_pool.emplace_back(&next[i]); } } auto rval = _free_pool.back(); _free_pool.pop_back(); return rval; } void Deallocate(Tp *p) { _free_pool.emplace_back(p); } const PageAllocator &InnerAllocator() const noexcept { return *page_allocator_; } private: std::uint64_t _page_size; std::vector _free_pool; };