template class FixedAllocator { PageAllocator page_allocator_; std::uint64_t page_size_ = 0; std::uint64_t curPos = 0; void* pageMem = nullptr; std::vector freeMem; public: FixedAllocator(std::uint64_t page_size) : page_allocator_(page_size), page_size_(page_size), curPos(page_size) {} Tp* Allocate() { Tp* p = nullptr; if (freeMem.size() > 0) { p = reinterpret_cast(freeMem[freeMem.size() - 1]); freeMem.pop_back(); return p; } if (curPos >= page_size_) { curPos = 0; pageMem = page_allocator_.Allocate(); } p = reinterpret_cast(reinterpret_cast(pageMem) + curPos); ++curPos; return p; } void Deallocate(Tp* p) { freeMem.push_back(p); } const PageAllocator& InnerAllocator() const noexcept { return page_allocator_; } };