#include #include template class FixedAllocator { PageAllocator* page_allocator_; public: explicit FixedAllocator(std::uint64_t page_size) { size_page = page_size; page_allocator_ = new PageAllocator(sizeof(Tp) * page_size); } Tp* Allocate() { if (_free_pool.empty()) { Tp* next = dynamic_cast(page_allocator_->Allocate()); for (uint 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_; } ~FixedAllocator() { delete (page_allocator_); } private: std::uint64_t size_page; std::vector _free_pool; };