Asignación de memoria en tiempo de ejecución en la stack

Quiero saber sobre la asignación de memoria en tiempo de ejecución en el área de la stack y cómo es diferente de la asignación de memoria en tiempo de ejecución en el área de almacenamiento dynamic.

Sé cómo la memoria se asigna mediante el uso de la función de biblioteca.

#include void *alloca(size_t size); //(for runtime memory on stack) #include void *malloc(size_t size); //(for run time memory on heap) 

También sé que si estamos usando la función alloca no necesitamos liberar esa memoria explícitamente porque está asociada con la stack, se libera automáticamente.

Quiero saber qué llamadas de sistema están asociadas con alloc y malloc y cómo funcionan en ambos.

En resumen, generalmente no usan llamadas al sistema, a menos que se estén quedando sin memoria disponible.

El comportamiento es diferente para cualquiera de los dos, así que explico de manera diferente.

malloc

Digamos que inicialmente su progtwig tiene 1 MB (por ejemplo) de memoria disponible para la asignación. malloc es una función de biblioteca (estándar) que toma este 1MB, mira la memoria que desea asignar, corta una parte del 1MB y se la da. Para la contabilidad, mantiene una lista enlazada de recuerdos no asignados. La función free luego agrega el bloque que se está liberando a la lista gratuita , liberando efectivamente la memoria (a pesar de que el sistema operativo aún no recupera nada de eso, a menos que free decida que tiene demasiada memoria y que realmente la devuelva a el sistema operativo).

Solo cuando te quedas sin tu 1MB, malloc pide al sistema operativo más memoria. La llamada del sistema en sí depende de la plataforma. Puedes echar un vistazo a esta respuesta por ejemplo.

alloca

Esta no es una función estándar, y podría implementarse de varias maneras, ninguna de las cuales probablemente llame a ninguna función del sistema (a menos que sean lo suficientemente buenas para boost el tamaño de tu stack, pero nunca se sabe).

Lo que hace alloca (o, de manera equivalente, lo hacen las matrices de longitud variable estándar (C99) (VLA)) es boost el marco de la stack de la función actual ajustando los registros apropiados (por ejemplo, esp en x86). Cualquier variable que se encuentre en el mismo marco de stack pero que se alloca después de la matriz de longitud variable (o memoria alloca ) será direccionada por ebp + size_of_vla + constant lugar de la simple y antigua ebp + constant .

Dado que el puntero de stack se recupera en el marco de la función anterior al regresar la función (o generalmente al salir de cualquier bloque {} ), cualquier alloca memoria de stack se alloca automáticamente.

La función alloca() normalmente es implementada por el proveedor del comstackdor y no tiene que ser una “llamada al sistema” en absoluto.

Dado que todo lo que necesita hacer es asignar espacio en el marco de stack local, puede implementarse de manera muy simple y, por lo tanto, ser increíblemente rápido en comparación con malloc() .

La página de manual de Linux para ello dice:

El código en línea a menudo consiste en una sola instrucción que ajusta el puntero de stack, y no verifica el desbordamiento de stack.

Además, no estoy seguro de que te alloca() cuenta de que la memoria se desasigna “automáticamente” cuando se alloca() la función que llamó a alloca() . Esto es muy importante, no puede usar alloca() para hacer asignaciones de larga duración.

La función alloca es, según su página de manual, una función que está en línea y será tratada especialmente por el comstackdor y expandida (al menos para gcc ).
El comportamiento está definido por la implementación y, como tal, no debe usarse, ya que no se puede garantizar que funcione de la misma manera siempre.