En C las funciones estándar de manejo de memoria son malloc()
, realloc()
y free()
. Sin embargo, las asignaciones stdlib de C++ solo son paralelas a dos de ellas: no hay una función de reasignación. Por supuesto, no sería posible hacer exactamente lo mismo que realloc()
, porque simplemente copiar la memoria no es apropiado para tipos no agregados. Pero habría un problema con, por ejemplo, esta función:¿Por qué no hay una funcionalidad de reasignación en asignadores de C++?
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
donde
ptr
está asignado previamente con el mismo asignador denum_now
objetos;num_requested
> =num_now
;
y la semántica de la siguiente manera:
- si asignador puede expandir dado bloque de memoria en
ptr
de tamaño paranum_now
objetos anum_requested
objetos, lo hace (salida memoria adicional no inicializado) y devuelvetrue
; - else no hace nada y devuelve
false
.
De acuerdo, esto no es muy simple, pero los asignadores, como tengo entendido, están destinados principalmente para contenedores y el código de los contenedores ya es complicado.
dado una función de este tipo, std::vector
, por ejemplo, podría crecer de la siguiente manera (pseudocódigo):
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
asignadores que son incapaces de cambiar el tamaño de la memoria por completo simplemente podría implementar una función de este tipo por return false;
incondicional.
¿Hay tan pocas implementaciones de asignadores con capacidad de reasignación que no merezca la pena molestarse? ¿O hay algunos problemas que pasé por alto?
+1, esta es una pregunta que siempre me molestó. –
La opinión de Stroustrup sobre esto: http://www2.research.att.com/~bs/bs_faq2.html#renew; delega el problema en el funcionamiento interno del vector, pero no dice por qué no hay un mecanismo como "renovar" para simplificar el crecimiento de la matriz. –
No hay nada que detenga 'std :: vector' en algunos casos (por ejemplo, sabe que usa el asignador estándar). La biblioteca estándar puede usar el conocimiento del sistema subyacente. – KeithB