52 lines
1.5 KiB
C++
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;
|
|
};
|