В C стандартными функциями обработки памяти являются malloc()
, realloc()
и free()
. Однако распределители stdlib в C ++ только параллельны двум из них: функция перераспределения отсутствует. Конечно, было бы невозможно сделать точно так же, как 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's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
Распределители, которые вообще не способны изменять размер памяти, могут просто реализовать такую функцию безоговорочно return false;
.
Есть ли так мало реализации распределителя с поддержкой перераспределения, что не стоило бы этого беспокоить? Или есть какие-то проблемы, которые я упустил из виду?