Advertisement
Guest User

AllocatorWithCommentary

a guest
Apr 23rd, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <vector>
  2.  
  3. class FixedAllocator {
  4.  public:
  5.   FixedAllocator(size_t chunk_size, size_t page_size);
  6.   void *Allocate();
  7.   void Deallocate(void *value);
  8.  
  9.  private:
  10.   size_t chunk_size;
  11.   size_t page_size;
  12.   std::vector<std::vector<unsigned char>> pool;
  13.   size_t free_memory = 0;
  14.   unsigned char *memory;
  15. };
  16.  
  17. FixedAllocator::FixedAllocator(size_t chunk_size, size_t page_size) {
  18.   this->chunk_size = chunk_size;
  19.   this->page_size = page_size;
  20. }
  21.  
  22. void *FixedAllocator::Allocate() {
  23.   // если оставшейся памяти меньше, чем нужно для одного выделения
  24.   if (chunk_size > free_memory) {
  25.     // засовываем в pool новый вектор размерности page_size * chunk_size
  26.     pool.emplace_back(page_size * chunk_size);
  27.     // говорим, что памяти свободной столько, каков размер нового вектора
  28.     free_memory = pool.back().size();
  29.     // указатель ставим на первый элемент нового вектора
  30.     memory = &pool.back().front();
  31.   }
  32.   // получаем указатель на свободную память
  33.   auto front_memory = memory;
  34.   // уменьшаем количество нашей свободной памяти
  35.   free_memory -= chunk_size;
  36.   // передвигаем указатель вправо на chunk_size
  37.   memory += chunk_size;
  38.   return front_memory;
  39. }
  40.  
  41. void FixedAllocator::Deallocate(void *value) {
  42.   // получаем указатель на удаляемую память
  43.   auto front_memory = (unsigned char *) value;
  44.   // устанавливаем указатель свободной памяти на удаляемый участок
  45.   memory = front_memory;
  46.   // говорим, что у нас теперь больше свободной памяти
  47.   free_memory += chunk_size;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement