Un marco de pila es un marco de datos que se inserta en la pila. En el caso de una pila de llamadas, un marco de pila representaría una llamada de función y sus datos de argumento.
Si no recuerdo mal, la dirección de retorno de la función se inserta primero en la pila, luego los argumentos y el espacio para las variables locales. Juntos, hacen el "marco", aunque es probable que esto dependa de la arquitectura. El procesador sabe cuántos bytes hay en cada cuadro y mueve el puntero de la pila en consecuencia a medida que los cuadros se empujan y salen de la pila.
EDITAR:
Hay una gran diferencia entre las pilas de llamadas de nivel superior y la pila de llamadas del procesador.
Cuando hablamos de la pila de llamadas de un procesador, estamos hablando de trabajar con direcciones y valores a nivel de byte / palabra en ensamblado o código de máquina. Hay "pilas de llamadas" cuando se habla de lenguajes de nivel superior, pero son una herramienta de depuración / tiempo de ejecución administrada por el entorno de tiempo de ejecución para que pueda registrar lo que salió mal con su programa (en un nivel alto). En este nivel, a menudo se conocen cosas como números de línea y métodos y nombres de clase. Cuando el procesador obtiene el código, no tiene absolutamente ningún concepto de estas cosas.
Si comprende muy bien la pila, comprenderá cómo funciona la memoria en el programa y si comprende cómo funciona la memoria en el programa, comprenderá cómo funciona la función almacenar en el programa y si comprende cómo funciona la función almacenar en el programa, comprenderá cómo funciona la función recursiva y si comprende cómo funciona la función recursiva, comprenderá cómo funciona el compilador y si comprende cómo funciona, su mente funcionará como compilador y depurará cualquier programa muy fácilmente
Déjame explicarte cómo funciona la pila:
Primero debe saber cómo se representan las funciones en la pila:
El almacenamiento dinámico almacena valores asignados dinámicamente.
La pila almacena valores de asignación y eliminación automáticos.
Vamos a entender con el ejemplo:
Ahora entienda partes de este programa:
Ahora veamos qué es stack y cuáles son las partes de stack:
Recuerde una cosa: si se cumple la condición de retorno de cualquier función, no importa si ha cargado las variables locales o no, regresará inmediatamente de la pila con su marco de pila. Significa que cada vez que una función recursiva obtiene la condición base satisfecha y ponemos un retorno después de la condición base, la condición base no esperará para cargar las variables locales que se encuentran en la parte "else" del programa. Inmediatamente devolverá el cuadro actual de la pila después de lo cual el siguiente cuadro está ahora en el registro de activación.
Vea esto en la práctica:
Entonces, cada vez que una función encuentra una declaración return, elimina el marco actual de la pila.
Al regresar de la pila, los valores se devolverán al revés del orden original en el que se asignaron en la pila.
fuente
hello()
ha llamado recursivamente a lohello()
que luego se ha llamado (nuevamente) recursivamentehello()
, y el marco global es la función original que se llamó primerohello()
.Un resumen rápido. Quizás alguien tenga una mejor explicación.
Una pila de llamadas se compone de 1 o varias tramas de pila. Cada marco de pila corresponde a una llamada a una función o procedimiento que aún no ha terminado con un retorno.
Para usar un marco de pila, un hilo mantiene dos punteros, uno se llama Puntero de pila (SP) y el otro se llama Puntero de marco (FP). SP siempre apunta a la "parte superior" de la pila, y FP siempre apunta a la "parte superior" del marco. Además, el hilo también mantiene un contador de programa (PC) que apunta a la siguiente instrucción que se ejecutará.
Lo siguiente se almacena en la pila: variables locales y temporales, parámetros reales de la instrucción actual (procedimiento, función, etc.)
Existen diferentes convenciones de llamadas con respecto a la limpieza de la pila.
fuente
"Una pila de llamadas se compone de marcos de pila ..." - Wikipedia
Un marco de pila es algo que pones en la pila. Son estructuras de datos que contienen información sobre subrutinas para llamar.
fuente
Los programadores pueden tener preguntas sobre los marcos de la pila no en un término amplio (que es una entidad simple en la pila que sirve solo una llamada de función y mantiene la dirección de retorno, los argumentos y las variables locales), pero en un sentido estricto, cuando el término
stack frames
se menciona en contexto de las opciones del compilador.Si el autor de la pregunta lo ha querido decir o no, pero el concepto de un marco de pila desde el aspecto de las opciones del compilador es un tema muy importante, no cubierto por las otras respuestas aquí.
Por ejemplo, el compilador C / C ++ de Microsoft Visual Studio 2015 tiene la siguiente opción relacionada con
stack frames
:GCC tiene lo siguiente:
El compilador Intel C ++ tiene lo siguiente:
que tiene el siguiente alias:
Delphi tiene la siguiente opción de línea de comandos:
En ese sentido específico, desde la perspectiva del compilador, un marco de pila es solo el código de entrada y salida para la rutina , que empuja un ancla a la pila, que también se puede usar para la depuración y para el manejo de excepciones. Las herramientas de depuración pueden escanear los datos de la pila y usar estos anclajes para retroceder, mientras se ubican
call sites
en la pila, es decir, para mostrar los nombres de las funciones en el orden en que se han llamado jerárquicamente. Para la arquitectura Intel, espush ebp; mov ebp, esp
oenter
para entrada y /mov esp, ebp; pop ebp
oleave
salida.Es por eso que es muy importante comprender para un programador en qué consiste un marco de pila cuando se trata de opciones del compilador, porque el compilador puede controlar si generar este código o no.
En algunos casos, el compilador puede omitir el marco de la pila (código de entrada y salida para la rutina), y se puede acceder directamente a las variables a través del puntero de la pila (SP / ESP / RSP) en lugar del conveniente puntero base (BP / ESP / RSP). Condiciones para la omisión del marco de la pila, por ejemplo:
Omitir marcos de pila (código de entrada y salida para la rutina) puede hacer que el código sea más pequeño y más rápido, pero también puede afectar negativamente la capacidad de los depuradores para rastrear los datos en la pila y mostrarlos al programador. Estas son las opciones del compilador que determinan en qué condiciones una función debe tener el código de entrada y salida, por ejemplo: (a) siempre, (b) nunca, (c) cuando sea necesario (especificando las condiciones).
fuente
El marco de pila es la información empaquetada relacionada con una llamada de función. Esta información generalmente incluye argumentos pasados a la función th, variables locales y dónde regresar al finalizar. El registro de activación es otro nombre para un marco de pila. El fabricante determina el diseño del marco de la pila en el ABI y cada compilador que admita el ISA debe cumplir con este estándar, sin embargo, el esquema de diseño puede depender del compilador. En general, el tamaño del marco de la pila no está limitado, pero existe un concepto llamado "zona roja / protegida" para permitir que las llamadas al sistema ... etc. se ejecuten sin interferir con un marco de la pila.
Siempre hay un SP pero en algunos ABI (ARM y PowerPC por ejemplo) FP es opcional. Los argumentos que debían colocarse en la pila se pueden compensar utilizando solo el SP. Si se genera un marco de pila para una llamada a función o no, depende del tipo y la cantidad de argumentos, las variables locales y cómo se accede a las variables locales en general. En la mayoría de los ISA, primero, se usan registros y si hay más argumentos que registros dedicados a pasar argumentos, estos se colocan en la pila (por ejemplo, x86 ABI tiene 6 registros para pasar argumentos enteros). Por lo tanto, a veces, algunas funciones no necesitan un marco de pila para colocarse en la pila, solo la dirección de retorno se inserta en la pila.
fuente