В языке С часто переписывают стандартный механизм для выделения памяти, реализуя свои функции аллокации как обертки над стандартными функциями (malloc/free). Это удобно, когда выделенных элементов много и они малого размера. Становится еще удобней, когда их не нужно удалять. Реализуется это очень просто:
- выделяется большая страница памяти
- из нее выдается память на каждый запрос аллокации
- когда страница заканчивается, то выделяется новая страница и т.д.
Бонуса здесь два: экономия памяти (не требуется хранить информацию о выделенной ячейке) и скорость.
В языке С нет классов, там все просто: захотел выделил память, разместил, вернул. Но что делать, если такой механиз нужен в С++? Ведь там при создании объекта должен отработать конструктор. А значит просто выдать память под ссылку недостаточно.
Вот как это можно реализовать:
char *page = new char[1024];
ClassA *a = new (page) ClassA;Сначала мы выделили страницу размером 1024 байта, а потом на ней создали объект. Следующий бъект можно выделить на участке памяти:
page + sizeof(ClassA)Чтобы удалить такой объект, нужно явно вызвать его деструктор.




Discussion