¿Hay garantías de que realloc() siempre encoja un buffer en el lugar? Así que la siguiente:¿Se garantiza que realloc estará en su lugar cuando el búfer se está contrayendo?
new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type));
siempre dará new_ptr == old_ptr si nuevo_tam < viejo_tam (excepto, por supuesto, cuando nuevo_tam == 0). Parece sensato (para mí) que funcione de esta manera, pero tenía curiosidad por saber si el estándar lo imponía.
estoy mirando a la reasignación de los arreglos de tipos de datos no-POD, y si se garantiza el comportamiento anterior estaba pensando que la siguiente estrategia podría permitir que al menos eficiente "reducción":
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 "Estoy esperando que un" encogimiento "in situ sea robusto incluso si el tipo de datos tuviera referencias/punteros automáticos o lo que sea ...
Gracias por sus comentarios a todos. Supongo que me resulta bastante inútil y poco eficiente tener que asignar un nuevo buffer y hacer una copia completa para lograr un "encogimiento" ... –
No voy a agregar al coro de "no" aquí, deberías obtener el idea por ahora. Pero un efecto secundario involuntario de garantizar que el bloque reasignado reutilice la misma memoria cuando se reduce es que no se puede usar un [pequeño asignador de objetos] (http://www.developer.com/ws/brew/article.php/3315011 /Small-Memory-Allocation.htm) dentro de malloc/realloc, ya que estos asignadores agrupan objetos de igual tamaño. –
Otra razón por la que no se puede esperar que realloc reutilice siempre la misma memoria es que los montones más generales colocan información de administración (tamaño de bloque, puntero al siguiente bloque en el montón) en un encabezado justo "al frente" de la memoria asignada. Por lo tanto, si tiene un bloque que se encuentra entre dos bloques asignados, y reasignado a una palabra más pequeña, no habría espacio para poner el encabezado de la palabra de memoria liberada, perdiéndolo de manera efectiva y fragmentando permanentemente su montón. –