Advertisement
den4ik2003

Untitled

Apr 29th, 2025
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. #include <cstddef>
  2. #include <new>
  3. #include <utility>
  4. #include <stdexcept>
  5.  
  6. template<class T, size_t N>
  7. class Allocator {
  8. private:
  9.     // Сырой буфер памяти под N объектов типа T
  10.     alignas(T) unsigned char buffer_[sizeof(T) * N];
  11.  
  12.     // Связанный список индексов свободных слотов
  13.     int freelist_[N];
  14.     int free_head_; // индекс первой свободной ячейки
  15.  
  16. public:
  17.     Allocator() {
  18.         // Изначально все ячейки свободны
  19.         for (int i = 0; i < N - 1; ++i)
  20.             freelist_[i] = i + 1;
  21.         freelist_[N - 1] = -1;
  22.         free_head_ = 0;
  23.     }
  24.  
  25.     template<typename... Args>
  26.     T* AllocateAndConstruct(Args&&... args) {
  27.         if (free_head_ == -1) {
  28.             throw std::bad_alloc();
  29.         }
  30.         int index = free_head_;
  31.         free_head_ = freelist_[index];
  32.  
  33.         T* ptr = reinterpret_cast<T*>(&buffer_[sizeof(T) * index]);
  34.         new (ptr) T(std::forward<Args>(args)...); // placement new
  35.         return ptr;
  36.     }
  37.  
  38.     void DestroyAndDeallocate(T* ptr) {
  39.         if (!ptr) return;
  40.  
  41.         ptr->~T(); // явный вызов деструктора
  42.  
  43.         // Вернуть ячейку в freelist
  44.         auto index = (reinterpret_cast<unsigned char*>(ptr) - buffer_) / sizeof(T);
  45.         freelist_[index] = free_head_;
  46.         free_head_ = index;
  47.     }
  48. };
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement