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