Red de conocimiento de abogados - Derecho de sociedades - El anidamiento de bloques de principios de microcomputadora no coincide

El anidamiento de bloques de principios de microcomputadora no coincide

Algunos programadores creen que definir una función dentro de otra función se llama "función anidada". Pero la realidad es que no es una función anidada, sino que se trata con alcance léxico. En C, el alcance léxico no tiene ningún efecto porque el compilador no puede alcanzar/encontrar la ubicación de memoria correcta de la función interna.

C no admite funciones anidadas porque no podemos definir una función dentro de otra función en C. Podemos declarar una función dentro de una función pero no es una función anidada.

Debido a que las definiciones de funciones anidadas no pueden acceder a las variables locales del bloque circundante, solo pueden acceder a las variables globales del módulo contenedor. Esto se hace para que no sea necesario buscar la variable global en el directorio. Como en C, hay dos ámbitos anidados: local y global (excepto las funciones integradas). Por lo tanto, las funciones anidadas son de uso limitado. Si intenta utilizar funciones anidadas en C, obtendrá un error en tiempo de compilación.

Salida:

Error en tiempo de compilación: referencia no definida a 'vista'

Una extensión del compilador GNU C permite la declaración de funciones anidadas. Las declaraciones de funciones anidadas bajo la extensión GCC deben tener el prefijo/comenzar con la palabra clave auto.

Además, gcc implementa principalmente la función de anidamiento a través de Trampoline, entonces, ¿qué es Trampoline?

Trampoline es en realidad un fragmento de código ejecutable que existe en la pila. El tiempo de ejecución lo genera dinámicamente y salta al código de destino real al ejecutar este código en la pila.

En cuanto a por qué el anidamiento de funciones debe implementarse a través de Trampoline, esto debe comenzar con las características de las funciones anidadas, porque pueden acceder a variables locales en funciones contenedoras:

De las cuales se compensa. son las variables en la función contenedora a las que se puede hacer referencia directamente en la función anidada. Esto no parece difícil de lograr: se puede acceder fácilmente a la variable de pila de la función contenedora a través del desplazamiento sp, pero hay otra situación que debe considerarse, y es decir, las funciones anidadas no solo se pueden llamar directamente en funciones de contenedor, sino que también se pueden llamar indirectamente en otras funciones a través de punteros de función. En este momento, el diseño del marco de pila activo es diferente del de las funciones de contenedor a las que se accede a través del desplazamiento sp. Ya no está en la función contenedora. Se obtendrán resultados inesperados según la posición de la variable.

Trampoline puede evitar eficazmente esta situación, porque Trampoline existe en la pila de la función contenedora y la posición relativa de las variables en relación con la función contenedora a la que se accede es fija, por lo que no importa cómo se anida la función. Cuando se llama, todos los ejecutados son Trampoline en la pila, de modo que las ubicaciones variables de las funciones del contenedor a las que se accede son siempre correctas. Sin embargo, esto requiere que la función contenedora no pueda salir cuando se llama a la función anidada; de lo contrario, el trampolín en la pila puede sobrescribirse y también se obtendrán resultados inesperados.