#pragma once #include "ncx_slab.h" #include template class mempool { public: mempool(size_t pool_size = 1024000) { // 1024KB // 分配一个缓存对齐的内存 // const auto space = static_cast(operator new(pool_size, std::align_val_t(alignment))); const auto space = static_cast(malloc(pool_size)); mem_pool_ = reinterpret_cast(space); mem_pool_->addr = space; mem_pool_->min_shift = 3; mem_pool_->end = space + pool_size; ncx_slab_init(mem_pool_); } ~mempool() { // operator delete(mem_pool_->addr, std::align_val_t(alignment)); free(mem_pool_->addr); } [[nodiscard]] void* alloc(size_t size) const { return ncx_slab_alloc(mem_pool_, size); } template [[nodiscard]] T* alloc(Args&&... args) const { T* out = (T*)alloc(sizeof(T)); new (out) T(std::forward(args)...); return out; } template [[nodiscard]] T* alloc() const { T* out = (T*)alloc(sizeof(T)); new (out) T(); return out; } void free(void* p) const { ncx_slab_free(mem_pool_, p); } [[nodiscard]] ncx_slab_stat_t stat() const { ncx_slab_stat_t out; ncx_slab_stat(mem_pool_, &out); return out; } private: ncx_slab_pool_t* mem_pool_ = nullptr; };