// you’re reading...

Programming

Создаем объект на уже выделенном буфере

В языке С часто переписывают стандартный механизм для выделения памяти, реализуя свои функции аллокации как обертки над стандартными функциями (malloc/free). Это удобно, когда выделенных элементов много и они малого размера. Становится еще удобней, когда их не нужно удалять. Реализуется это очень просто:

  1. выделяется большая страница памяти
  2. из нее выдается память на каждый запрос аллокации
  3. когда страница заканчивается, то выделяется новая страница и т.д.

Бонуса здесь два: экономия памяти (не требуется хранить информацию о выделенной ячейке) и скорость.

В языке С нет классов, там все просто: захотел выделил память, разместил, вернул. Но что делать, если такой механиз нужен в С++? Ведь там при создании объекта должен отработать конструктор. А значит просто выдать память под ссылку недостаточно.

Вот как это можно реализовать:

char *page = new char[1024];
 
ClassA *a = new (page) ClassA;

Сначала мы выделили страницу размером 1024 байта, а потом на ней создали объект. Следующий бъект можно выделить на участке памяти:

page + sizeof(ClassA)

Чтобы удалить такой объект, нужно явно вызвать его деструктор.


Discussion