В 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;
.
Есть ли так мало возможностей для реализации распределителя, которые не стоило бы беспокоиться? Или есть некоторые проблемы, которые я забыл?