Допустим, я пишу собственный вектор, используя std::allocator
для обтекания new
и delete
.
Когда количество элементов превышает емкость вектора, я хотел бы перераспределить буфер на что-то большее. Я легко могу этого добиться, позвонив realloc()
. Я не хочу этого делать, потому что думал, что ответственность за выделение / освобождение должна лежать в распределителе.
Тем не менее, глядя на интерфейс std::allocator
, я не понимаю, как мне сделать перераспределение. Есть только методы для:
T* allocate( std::size_t n );
void deallocate( T* p, std::size_t n );
Должен ли я звонить allocator::allocate
, а затем allocator::deallocate
, а не просто realloc
? Это так же эффективно? Это должно быть то, что делает std::vector
. Почему std::allocator
не предоставляет функцию reallocate
?
realloc
работает на более низком уровне, чем, скажем,std::vector
емкость, они оба делают в основном одно и то же, и реализация перераспределения самостоятельно с использованием комбинацииallocate
,deallocate
и перемещение должно быть столь же эффективным (вероятно, в целом более эффективно, так как мы можем давать подсказки в форме емкости):realloc
в конце концов не творит магию. - person Konrad Rudolph   schedule 02.08.2016