52 lines
1.5 KiB
C++

#pragma once
#include "ncx_slab.h"
#include <cstdlib>
template<int32_t alignment = 64>
class mempool {
public:
mempool(size_t pool_size = 1024000) { // 1024KB
// 分配一个缓存对齐的内存
// const auto space = static_cast<u_char*>(operator new(pool_size, std::align_val_t(alignment)));
const auto space = static_cast<u_char*>(malloc(pool_size));
mem_pool_ = reinterpret_cast<ncx_slab_pool_t*>(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<typename T, typename ...Args>
[[nodiscard]] T* alloc(Args&&... args) const {
T* out = (T*)alloc(sizeof(T));
new (out) T(std::forward<Args>(args)...);
return out;
}
template<typename T>
[[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;
};