[C con Clase] duda con cadenas en C

Steven Richard Davidson stevenrichard.davidson en gmail.com
Sab Dic 22 21:44:49 CET 2007


Hola Programante,

On 12/21/07, Programante <programante en gmail.com> wrote:

[CORTE]

> > Esto es algo costoso porque 'realloc()' está readjudicando memoria
> > continuamente.
> ¿Lo hace realmente?
> Normalmente* malloc() reserva el espacio en potencias de 2, de forma que
> al llamar a realloc() con una unidad mayor la mayor parte de las veces
> ya tendríamos reservado más y volvería inmediatamente. Sólo tendría que
> reservar-copiar-liberar en las potencias de 2.
>
> *Depende por completo de la implementación, consulta el manual de tu
> librería de C.
>

Como has mencionado, el comportamiento que ha descrito depende
totalmente de la implementación de 'malloc()'. Típicamente, 'malloc()'
invocaría alguna función del gestionador de memoria que forma parte
del sistema operativo. Ahora bien, si tal gestionador se basa en este
comportamiento de potencias de dos, entonces lo más seguro es que
'malloc()' haga lo mismo.

Personalmente, me parece un derroche de memoria ir con potencias de
dos. Si yo pido diez mil elementos de 600 bytes cada uno, sería una
petición de 6.000.000 de bytes, pero según el comportamiento de
derroche, el sistema pediría 8.388.608 bytes. Esto supondría un exceso
de casi el 40% de la petición original.

Obviamente, lo anterior sería una ventaja si existiese una nueva
petición sobre el mismo bloque menor de 8.388.608 bytes. Dicho esto,
ciertas estructuras dinámicas de datos sí implementan este
comportamiento para aprovecharse de esta ventaja. Esto es el caso de
la clase-plantilla 'vector<>' y algunas otras de las STL. Sin embargo,
hacer potencias de dos suele excederse demasiado rápidamente con
peticiones grandes. Por esta razón se opta por implementar un
incremento fijo.

Hasta pronto,

Steven




Más información sobre la lista de distribución Cconclase