Discussion:
gestion de la memoria
(demasiado antiguo para responder)
raul
2004-11-19 16:56:49 UTC
Permalink
Tengo serias dudas acerca de la gestión de memoria en C.

Tengo un programa que hace poca cosa, me dice si un numero es par o no:

#include <stdio.h>

main()
{
int a;
while(scanf("%d",&a))
{
a = a&1;
printf("%d\n",a);
}
}

como puedo saber el tamaño de memoria virtual que voy a necesitar durante la
ejecución?

Gracias
Raul
J.A. Gutierrez
2004-11-22 09:06:44 UTC
Permalink
raul <***@hotmail.com> wrote:
: Tengo un programa que hace poca cosa, me dice si un numero es par o no:

: como puedo saber el tamaño de memoria virtual que voy a necesitar durante la
: ejecución?

No puedes.

Dependiendo del sistema operativo y del entorno de desarrollo,
puede que tengas herramientas para ayudarte a estimarlo y/o
a medirlo.

En Unix, te puede ser de utilidad el comando "size"; aunque
si utilizas memoria dinamica (malloc) tendras que sumar eso
a mano (tambien te pueden venir bien para esto librerias
de gestion de memoria para "debug" tipo Electric Fence).
--
PGP and other useless info at \
http://webdiis.unizar.es/~spd/ \
finger://daphne.cps.unizar.es/spd \ Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/ \ (Virgilio)
Antoine Leca
2004-11-26 12:40:24 UTC
Permalink
Post by raul
Tengo serias dudas acerca de la gestión de memoria en C.
C ne gestiona la memoria, lo hace el sistema operativo.
Post by raul
Tengo un programa que hace poca cosa,
...
Post by raul
como puedo saber el tamaño de memoria virtual que voy a necesitar
durante la ejecución?
No lo puedes, ni importa: estos días, un programa gasta un montón de memoria
para nada, mejor dicho, para cosas irrelevantes (como puede ser bibliotecas
dinámicas, tener hilos, prevención de los agujeros de mala programación como
puden ser desbordiamiento de búfers, compatibilidad con arquitectura
orientadas a objectos y varios otras funcionalidades que este programa no
necesite).

Además, la memoria virtual es eso, virtual. La única cosa relevante que
puede importarte es si va a desbordar del marco, el espacio de adresas
otorgado per la arquitectura del sistema; particularamente el tamaño de la
pila, esos días.
Y claro está que si hay desbordamiento, no lo será por un programa que hace
poca cosa...


Aparte de estas consideraciones, el tamaño lo debes calcular considerando el
momento más critico del programa: es decir, al más profundo de las
recursiones (que te dará el tamaño de la "pila"), sumandolo el total de las
alocaciones dinámicas (malloc que no ha sido liberado por free) y por
supuesto las cosas estáticas como el código y los globales. Y como hay dos
contadores independientes, puede ser que el computo sea dificil, llamando a
iteraciones o dependiente de los argumentos.

En tu caso es senzillo (que no fácil): hay solo dos momentos potenciales
criticos: en el scanf y en el printf. El segundo es más o menos previsible,
hay que sumar las pilas de las funciones que se utilizán, y los búferes de
salida de *stdout y él de entrada de *stdin (que está alocado
dinámicamente), más el almacimiento de a y todo lo estático. Pero el computo
del tamaño para el scanf es mucho más complicado, por que no sabes todo de
las entradas que te van a pasar; por ejemplo, si te pasan una cadena de un
millón de '0', algunas implementaciones pueden pedir almacenar todos estos
'0' antes de hacer la conversión, y otros no lo hicierón.


Antoine

Loading...