是否有任何保證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