Cómo GCC implementa las funciones anidadas

Fuentes: How GCC Implements Nested Functions

Las funciones anidadas son una extensión histórica del lenguaje C en GCC que permite definir una función dentro del cuerpo de otra. Este artículo analiza en detalle el mecanismo interno que emplea el compilador para que una función an acceda a las variables de su función padre. La pieza clave es una fase temprana del middle-end que agrupa todas las variables capturadas en una estructura sintética y pasa un puntero oculto a esa estructura como argumento adicional de la función hija. Las lecturas y escrituras se reescriben entonces como accesos a miembros de la estructura, de modo que el resto del compilador puede tratar ese puntero como cualquier argumento que apunta a una estructura ordinaria. El ejemplo más simple, en el que la función anidada solo usa una variable k del padre, se transforma en una función estática que recibe struct frame *f junto al parámetro x, y el optimizador acaba reduciendo el conjunto a una única instrucción de suma. Cuando hay varios niveles de anidamiento, la estructura incluye un enlace al marco del nivel superior, formando una cadena. El texto compara además esta técnica con los lambdas de C++: mientras que GCC crea una sola estructura compartida entre todas las funciones anidadas del mismo padre que capturan la misma variable, un compilador de C++ genera objetos anónimos separados por cada expresión lambda, cada uno con su propia referencia a k. A pesar de esa diferencia de implementación, la semántica es equivalente, y el artículo concluye que un compilador que ya implemente lambdas de C++ podría ofrecer una función con la misma sintaxis y semántica que las funciones anidadas de GNU C reutilizando su infraestructura existente. También se menciona la propuesta N3884 ante WG14, que permitiría funciones locales sin captura declaradas con la clase de almacenamiento static.