Да, можешь заставить new выделять память из конкретной области, используя placement new вместе с custom memory pool. Эта техника позволяет тебе контролировать выделение памяти для оптимизации производительности и управления ресурсами.
Основа — это placement new, которая создаёт объект в заранее выделенной памяти:
void* raw = allocate(sizeof(Foo)); // Get raw memory
Foo* p = new(raw) Foo(); // Construct object in that memory
Это разделяет выделение памяти и конструирование объекта, позволяя тебе использовать любой источник памяти.
Создай класс Pool, который управляет выделенной областью памяти:
class Pool {
public:
void* alloc(size_t nbytes);
void dealloc(void* p);
private:
// Implementation details
};
Чтобы упростить использование, перегрузи operator new, чтобы он принимал ссылку на Pool:
inline void* operator new(size_t nbytes, Pool& pool) {
return pool.alloc(nbytes);
}
Теперь можешь использовать более чистый синтаксис:
Foo* p = new(pool) Foo(); // Вместо: new(pool.alloc(sizeof(Foo))) Foo()
Предоставь соответствующий operator delete, чтобы компилятор автоматически обрабатывал исключения во время конструирования:
void operator delete(void* p, Pool& pool) {
pool.dealloc(p);
}
Это гарантирует, что память освободится, если конструктор выбросит исключение.
alloca(), чтобы получить память пула, которая освобождается автоматическиPlacement new разделяет выделение памяти и конструирование объекта, позволяя тебе создавать объекты в предвыделенной памяти из любого источника.
Новый — ещё не проверен сообществом
Вы