C 语言中的标准内存处理函数是 malloc()
、realloc()
和 free()
。然而,C++ 的 stdlib 分配器只并行支持其中两个函数:没有重新分配函数。当然,这并不可能完全像 realloc()
那样做,因为简单地复制内存对于非聚合类型来说是不适当的。但是,使用下面的函数会有问题吗:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
函数的含义如下:
- 如果分配器能够将已分配给
num_now
个对象的内存块在ptr
处从大小扩展到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;
的函数来解决。
是否很少有能够重新分配内存的分配器实现,以至于不值得费心去解决?还是我忽略了一些问题?
std::vector
可能会采用这种方式(例如,它知道自己在使用标准分配器),没有任何障碍可以阻止标准库利用底层系统的知识。 - KeithB