9template <std::
size_t SEGMENT_SIZE = 16384>
10class SegmentedMemoryPool {
11 std::size_t space_left_ = 0;
12 void* current_ =
nullptr;
13 std::vector<void*> segments_;
16 SegmentedMemoryPool() =
default;
18 ~SegmentedMemoryPool()
20 for (
void* segment : segments_) {
21 delete[] (
reinterpret_cast<char*
>(segment));
26 T* allocate(
const std::size_t elements)
28 const std::size_t size = elements *
sizeof(T);
30 assert(size <= SEGMENT_SIZE);
32 if (!std::align(
alignof(T), size, current_, space_left_)) {
33 space_left_ = SEGMENT_SIZE;
34 current_ = ::operator
new[](SEGMENT_SIZE);
35 segments_.push_back(current_);
38 T* res =
reinterpret_cast<T*
>(current_);
39 current_ =
reinterpret_cast<char*
>(current_) + size;
45 std::size_t size_in_bytes()
const
47 return segments_.size() * SEGMENT_SIZE;
This namespace contains commonly used storage and container types.
Definition per_state_storage.h:16