| Artículos | 01 MAR 1995

Truco 122: Asignación dinámica de memoria

Tags: Histórico
Aurelio Llorente.

Se trata de una implementación en Pascal de la función alloca de C. La función alloca, prototipo void *alloca(size_t size), realiza asignación dinámica de memoria en la pila, obtiene size bytes en la misma.

La función realizada en Pascal, function Alloca(size:Word):Pointer, nos permite obtener la funcionalidad de su homónima en C.

Esta función se ha escrito bajo la forma que el manual de Borland define como 'inline directive', bajo esta especificación una función inline se expande como si de una macro se tratase, se puede encontrar una descripción de este tipo de declaración en las páginas 345-346 del manual 'Language guide' que acompaña a Borland Pascal 7.0.

La gestión de memoria que se obtiene con alloca es bastante peculiar, y podría ser definida como asignación dinámica-liberación automática. Cuando se trabaja con alloca no es necesario liberar la memoria que hayamos asignado, sino que es la función en la que se llama a alloca la que realiza la liberación. La memoria que se consigue con alloca tiene el mismo carácter que las variables locales en un procedimiento o función.

Ventajas al usar alloca:

- La función es rápida, más si tenemos en cuenta su carácter de macro, no es necesario código de entrada o salida.

- El código generado es corto, 7 bytes.

- Se obtiene exactamente la memoria que se pide, no más, no es necesario mantener ningún alineamiento o crear zonas de control dentro del bloque de memoria.

- Se disminuye la posibilidad de errores, la liberación de la memoria es automática, no hay que llamar a una función para liberarla.

Resumiendo, alloca es una forma eficiente y eficaz de obtener memoria de forma dinámica y ámbito local.

Inconvenientes de usar alloca:

- alloca es una función potencialmente peligrosa, ya que puede provocar un desbordamiento de la pila. La función no realiza comprobaciones antes de operar sobre la pila. El tamaño máximo que se puede asignar depende del programa y del momento en que se realice la asignación, se deberá ajustar el tamaño de la pila si aparecen problemas.

- El carácter local de la memoria obtenida limita los usos que pueden darse a la rutina.

- Al basarse el funcionamiento de la rutina en el código de salida de Pascal, es necesario que al menos se defina una variable local, ya que sino el código de salida no podrá devolver la pila a su estado original.

Resumiendo, alloca obtiene memoria de tipo local, es necesario definir al menos una variable en la función o procedimiento que vaya a usarla y su uso es potencialmente peligroso, sobre todo si se intenta obtener bloques grandes de memoria.

La función alloca no es una función ANSI, creo que es una extensión BSD, Berkeley Unix.

Adjunto un pequeño ejemplo que realiza la impresión de una cadena en mayúsculas preservando la cadena original, se incluye la misma función utilizando asignación dinámica en el 'heap', y realiza un pequeño test de velocidad comparando alloca y el gestor de memoria.

Tanto los ejemplos como la función alloca se han realizado en Borland Pascal 7.0.

La función es operativa tanto en modo real como en protegido, el incremento de velocidad en modo protegido es bastante espectacular, como muestra el ejemplo.

Para compilar el ejemplo hay que seleccionar el modo protegido, bien desde el entorno integrado o con el siguiente comando desde Dos:

bpc alloca -cp.

El programa funciona también en modo real, si se fuerza la compilación en modo protegido es para resaltar la ganancia en velocidad que alloca consigue en este modo.

Juan José Eraso Escalona

Calahorra (La Rioja)

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información