Marco de pila
: la pila es uno de los segmentos de la memoria de la aplicación que se utiliza para almacenar las variables locales, llamadas de función de la función. Cada vez que hay una llamada de función en nuestro programa, la memoria de las variables locales y otras llamadas de función o subrutinas se almacenan en el marco de la pila. Cada función obtiene su propio marco de pila en el segmento de pila de la memoria de la aplicación.
Características :
- La memoria asignada para una llamada de función en la pila vive solo el tiempo en que la función se ejecuta una vez que la función se completa, no podemos acceder a las variables de esa función.
- Una vez que la función que llama completa su ejecución, su marco de pila se elimina y el hilo de ejecución de la función llamada se reanuda desde la posición donde se dejó.
- La pila se usa para almacenar llamadas a funciones, por lo que en el caso de que usemos muchas llamadas recursivas en nuestro programa, la memoria de la pila se agota por las llamadas a funciones o las subrutinas, lo que puede provocar un desbordamiento de la pila porque la memoria de la pila es limitada.
- Cada marco de pila mantiene el puntero de pila (SP) y el puntero de marco (FP). El puntero de pila y el puntero de marco siempre apuntan a la parte superior de la pila. También mantiene un contador de programa (PC) que apunta a la siguiente instrucción a ejecutar.
- Cada vez que se realiza una llamada de función, se crea un marco de pila en el segmento de pila, los argumentos proporcionados por la función que llama obtienen algo de memoria en el marco de pila de la función llamada, y se insertan en el marco de pila de la función llamada. Cuando finaliza su ejecución, se extraen del marco de la pila. Y el hilo de ejecución continúa en la función llamada.
Estructura del marco de pila:
el puntero de pila siempre apunta a la parte superior y el puntero de marco almacena la dirección de todo el marco de pila de la subrutina. Cada marco de pila de una subrutina o una función contiene lo siguiente.
Marco de pila |
---|
Otras llamadas a funciones |
Otros registros guardados |
Variables locales |
Guardado [Frame Pointer] de la función llamada |
[Registro de enlace] guardado de la función llamada |
Argumentos pasados |
Puntero de cuadro (FP) |
Un marco de pila típico de una subrutina.
Implementación en C++:
Consideremos un programa de ejemplo para comprender mejor el marco de la pila.
C++
#include <iostream> using namespace std; //product method int findProduct(int a, int b) { int product = a * b; return product; } //findSum method int findSum(int a, int b) { int sum = a + b; return sum; } //main function int main() { int a = 6; int b = 6; //findProduct method called int product = findProduct(a, b); //findSum method called int sum = findSum(a, b); cout << "Product is :" << product << endl; cout << "Sum is :" << sum << endl; return 0; }
Producción :
Product is :36 Sum is :12
Explicación usando Stack:
Paso 1:
cuando main() llama a la función findProduct, se crea un nuevo marco de pila de la siguiente manera.
buscarProducto() a = 6 producto = a* b |
main() a = 6 b=6 producto = llamar a buscarProducto() suma = llamar a buscarSuma() |
Pila
Paso 2:
después de que la función findProduct finalice su instrucción y regrese a main() y el marco de la pila para findProduct se extraiga de la pila. Después de eso, main() llama a la función findSum().
encontrarSuma() a = 6 b=6 suma = a+ b |
principal() a = 6 |
Pila
Paso 3:
después de que la función findSum termine su instrucción y regrese a main(), findSum() se extrae de la pila de la siguiente manera.
principal() a = 6 b=6 producto = 36 suma = 12 |
Pila
Paso 4:
ahora la función main() ejecuta las declaraciones restantes y se extrae de la pila y la pila se vacía.
Publicación traducida automáticamente
Artículo escrito por lokeshpotta20 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA