Ci sono garanzie che realloc() ridurrà sempre un buffer sul posto ?? In modo che il seguente:Realloc garantisce la presenza sul posto quando il buffer si sta restringendo?
new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type));
darà sempre new_ptr == old_ptr se new_size < old_size (tranne ovviamente quando new_size == 0). Sembra ragionevole (per me) che funzionerebbe in questo modo, ma era curioso che lo standard lo imponesse.
Sto guardando la riallocazione di array di tipi di dati non-POD, e se il comportamento precedente è stato garantito pensava che la seguente strategia potrebbe almeno consentire efficiente "restringimento":
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
}
I "mi aspetto che un" restringimento "sul posto sia solido anche se il tipo di dati avesse riferimenti/puntatori di auto o altro ...
Grazie per i vostri commenti a tutti. Immagino che trovo abbastanza dispendioso e inefficiente dover allocare un nuovo buffer e fare una copia completa per ottenere un "restringimento" ... –
Non aggiungendo al coro di "no" qui, dovresti ottenere il idea ormai. Ma un involontario effetto collaterale di garantire che il blocco riallocato riutilizzi la stessa memoria quando ridotto è che non si poteva usare un [piccolo allocatore di oggetti] (http://www.developer.com/ws/brew/article.php/3315011 /Small-Memory-Allocation.htm) all'interno di malloc/realloc, poiché questi allocatori raggruppano insieme oggetti di uguale dimensione. –
Un altro motivo per cui non è possibile aspettarsi che realloc riutilizzi sempre la stessa memoria è che la maggior parte degli heap generici mette le informazioni di gestione (dimensione del blocco, puntatore al prossimo blocco nell'heap) in un'intestazione a destra "in primo piano" della memoria allocata. Quindi, se si dispone di un blocco che si trova tra due blocchi allocati e riallocato in una parola più piccola, non ci sarebbe spazio per inserire l'intestazione per la parola libera della memoria, perdendola effettivamente e frammentando in modo permanente il proprio heap. –