Saltar al contenido

¿Son las funciones anidadas algo malo en gcc?

Buscamos en diferentes foros y así darte la solución para tu duda, si continúas con inquietudes puedes dejarnos tu comentario y te responderemos con mucho gusto, porque estamos para servirte.

Solución:

Las funciones anidadas realmente no hacen nada que no puedas hacer con las que no están anidadas (razón por la cual ni C ni C ++ las proporcionan). Dice que no está interesado en otros compiladores; bueno, esto puede ser cierto en este momento, pero ¿quién sabe lo que traerá el futuro? Los evitaría, junto con todas las demás “mejoras” de GCC.

Una pequeña historia para ilustrar esto: solía trabajar para un Polytechinc del Reino Unido que usaba principalmente cajas DEC, específicamente un DEC-10 y algunos VAXen. Toda la facultad de ingeniería utilizó las muchas extensiones DEC para FORTRAN en su código; estaban seguros de que seguiríamos siendo una tienda DEC para siempre. Y luego reemplazamos el DEC-10 con un mainframe de IBM, cuyo compilador FORTRAN no admitía ninguna de las extensiones. Ese día hubo muchos lamentos y crujir de dientes, les puedo asegurar. Mi propio código FORTRAN (un simulador 8080) se transfirió a IBM en un par de horas (casi todo dedicado a aprender a manejar el compilador de IBM), porque lo había escrito en FORTRAN-77 estándar de bog.

Hay ocasiones en que las funciones anidadas pueden ser útiles, particularmente con algoritmos que mezclan muchas variables. Algo así como un tipo de combinación de 4 vías escrito podría necesitar mantener muchas variables locales y tener una cantidad de piezas de código repetido que usan muchas de ellas. Llamar a esos bits de código repetido como una rutina auxiliar externa requeriría pasar una gran cantidad de parámetros y / o hacer que la rutina auxiliar acceda a ellos a través de otro nivel de direccionamiento indirecto del puntero.

En tales circunstancias, podría imaginar que las rutinas anidadas podrían permitir una ejecución de programa más eficiente que otros medios de escribir el código, al menos si el compilador optimiza para la situación en la que cualquier recursividad que existe se realiza volviendo a llamar a la función más externa; Las funciones en línea, si el espacio lo permite, pueden ser mejores en CPU sin caché, pero el código más compacto que ofrece tener rutinas separadas puede ser útil. Si las funciones internas no pueden llamarse a sí mismas o entre sí de forma recursiva, pueden compartir un marco de pila con la función externa y, por lo tanto, podrían acceder a sus variables sin la penalización de tiempo de una desreferencia de puntero adicional.

Dicho todo esto, evitaría el uso de características específicas del compilador, excepto en circunstancias en las que el beneficio inmediato supere cualquier costo futuro que pueda resultar de tener que reescribir el código de alguna otra manera.

Como la mayoría de las técnicas de programación, las funciones anidadas deben usarse cuando y solo cuando sean apropiadas.

No está obligado a usar este aspecto, pero si lo desea, las funciones anidadas reducen la necesidad de pasar parámetros accediendo directamente a las variables locales de la función que las contiene. Eso es conveniente. El uso cuidadoso de parámetros “invisibles” puede mejorar la legibilidad. El uso descuidado puede hacer que el código sea mucho más opaco.

Evitar algunos o todos los parámetros hace que sea más difícil reutilizar una función anidada en otro lugar porque cualquier nueva función contenedora tendría que declarar esas mismas variables. La reutilización suele ser buena, pero muchas funciones nunca se reutilizarán, por lo que a menudo no importa.

Dado que el tipo de una variable se hereda junto con su nombre, la reutilización de funciones anidadas puede generar un polimorfismo económico, como una versión limitada y primitiva de las plantillas.

El uso de funciones anidadas también presenta el peligro de errores si una función accede o cambia involuntariamente una de las variables de su contenedor. Imagine un bucle for que contiene una llamada a una función anidada que contiene un bucle for que utiliza el mismo índice sin una declaración local. Si estuviera diseñando un lenguaje, incluiría funciones anidadas pero requeriría una declaración “heredar x” o “heredar const x” para que sea más obvio lo que está sucediendo y para evitar herencias y modificaciones no intencionales.

Hay varios otros usos, pero quizás lo más importante que hacen las funciones anidadas es permitir funciones auxiliares internas que no son visibles externamente, una extensión de C y C ++ static no funciones externas o funciones privadas no públicas de C ++. Tener dos niveles de encapsulación es mejor que uno. También permite la sobrecarga local de nombres de funciones, por lo que no necesita nombres largos que describan en qué tipo trabaja cada una.

Existen complicaciones internas cuando una función contenedora almacena un puntero a una función contenida y cuando se permiten múltiples niveles de anidamiento, pero los escritores de compiladores han estado lidiando con esos problemas durante más de medio siglo. No hay problemas técnicos que hagan más difícil agregar a C ++ que a C, pero los beneficios son menores.

La portabilidad es importante, pero gcc está disponible en muchos entornos, y al menos otra familia de compiladores admite funciones anidadas: xlc de IBM disponible en AIX, Linux en PowerPC, Linux en BlueGene, Linux en Cell yz / OS. Consulte http://publib.boulder.ibm.com/infocenter/comphelp/v8v101index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fnested_functions.htm

Las funciones anidadas están disponibles en algunos lenguajes nuevos (por ejemplo, Python) y muchos más tradicionales, incluidos Ada, Pascal, Fortran, PL / I, PL / IX, Algol y COBOL. C ++ incluso tiene dos versiones restringidas: los métodos en una clase local pueden acceder a las funciones que los contienen. static (pero no automáticas), y los métodos de cualquier clase pueden acceder static miembros y métodos de datos de clase. El próximo estándar C ++ tiene funciones lamda, que en realidad son funciones anidadas anónimas. Así que el mundo de la programación tiene mucha experiencia a favor y en contra con ellos.

Las funciones anidadas son útiles, pero tenga cuidado. Utilice siempre las funciones y herramientas donde le ayuden, no donde le duelan.

Puedes reafirmar nuestro ensayo mostrando un comentario o dejando una puntuación te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *