В C стандартными функциями обработки памяти являются malloc(), realloc() и free(). Однако С++ stdlib-распределители только параллельны двум из них: нет функции перераспределения. Конечно, было бы невозможно сделать то же самое, что и realloc(), потому что простое копирование памяти не подходит для неагрегатных типов. Но будет ли проблема с, скажем, этой функцией:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
где
-
ptrранее выделяется одним и тем же распределителем дляnum_nowобъектов; -
num_requested>=num_now;
и семантику следующим образом:
- Если распределитель может расширить данный блок памяти в
ptrот размера для объектовnum_nowдо объектовnum_requested, он делает это (оставив дополнительную память неинициализированным) и возвращаетtrue; - иначе он ничего не делает и возвращает
false.
Конечно, это не очень просто, но распределители, как я понимаю, в основном предназначены для контейнеров и кода контейнеров, как правило, уже сложны.
При такой функции std::vector, скажем, может расти следующим образом (псевдокод):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
Активаторы, которые не могут изменять размер памяти в целом, могут просто реализовать такую функцию безусловным return false;.
Есть ли так мало возможностей для реализации распределителя, которые не стоило бы беспокоиться? Или есть некоторые проблемы, которые я забыл?