是否有任何保证realloc()将始终在原地收缩缓冲区?所以,下面的:当缓冲区缩小时,realloc是否保证就地运行?
new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type));
总会给new_ptr == old_ptr如果new_size < old_size(当然除了当new_size == 0)。对我来说,这似乎是合理的,但它对这个标准是否强制执行感到好奇。
我看非POD数据类型的数组的重新分配,如果上述行为是有保障的想法,以下策略可能至少能让高效“缩水”:
if (new_size > old_size)
{
// malloc() a new buffer
// use placement copy constructor to copy old objects over
// free() old buffer
}
else
if (new_size < old_size)
{
// explicit destruction of unneeded objects
// realloc() buffer
}
我“m期望即使数据类型有自己的引用/指针或任何其他地方的就地”收缩“将是强大的...
感谢您的评论大家。我想我只是觉得它非常浪费和效率不高,不得不分配一个新的缓冲区,并做一个完整的副本,以实现“收缩”... – 2010-07-02 00:34:45
不会添加到这里的“不”的合唱团,你应该得到现在的想法。但是,保证重新分配的块在收缩时重用同一内存的一个非预期的副作用是您无法使用[小对象分配器](http://www.developer.com/ws/brew/article.php/3315011 /Small-Memory-Allocation.htm)在malloc/realloc中,因为这些分配器将相同大小的对象组合在一起。 – 2010-07-02 00:37:10
另一个不能指望realloc始终重用相同内存的原因是,大多数通用堆将管理信息(块大小,指向堆中下一个块的指针)放在分配内存“前面”的标题中。因此,如果你有一个坐在两个分配块之间的块,并且只读出一个较小的块,那么就没有空间为释放的内存单词放置标题,实际上会丢失它并永久分割你的堆。 – 2010-07-02 00:40:57