在 C 中,标准的内存处理函数malloc()
是realloc()
和free()
。但是,C++ 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's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
无法完全改变内存大小的分配器可以通过 unconditional 实现这样的功能return false;
。
是否有这么少的能够重新分配的分配器实现不值得打扰?还是我忽略了一些问题?