【发布时间】:2011-03-07 12:11:53
【问题描述】:
在 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
不能完全改变内存大小的分配器可以通过无条件的return false;来实现这样的功能。
是否有这么少的可重新分配的分配器实现不值得费心?还是我忽略了一些问题?
【问题讨论】:
-
+1,这个问题一直困扰着我。
-
Stroustrup 对这件事的看法:www2.research.att.com/~bs/bs_faq2.html#renew;它将问题委托给向量的内部工作,但没有说明为什么没有像“更新”这样的机制来简化数组的增长。
-
在某些情况下没有什么能阻止
std::vector这样做(例如,它知道它使用标准分配器)。允许标准库使用底层系统的知识。
标签: c++ memory-management realloc