#pragma once #include #include #include template class FixedAllocator { public: explicit FixedAllocator(std::uint64_t page_size) : page_size_(page_size), page_allocator_(page_size * sizeof(Tp)) {} Tp* Allocate() { if (free_memory_.empty()) { Tp* free_memory_ = reinterpret_cast(page_allocator_.Allocate()); for (uint64_t i = 0; i < page_size_; i++) { free_memory_.push(free_memory_ + i); } } Tp* free_memory = free_memory_.top(); free_memory_.pop(); return free_memory_; } void Deallocate(Tp* p) { free_memory_.push(p); } const PageAllocator& InnerAllocator() { return page_allocator_; } private: PageAllocator page_allocator_; uint64_t page_size_; std::stack free_memory_; std::unordered_set memory; };