11 La pila de llamadas a funciones y los registros de activacin
Uno de los mecanismos ms importantes que los estudiantes de ciencias computacionales deben comprender es lapila de llamadas a funciones (conocida algunas veces como la pila de ejecucin del programa). Esta estructura de datos (que trabaja en segundo plano) soporta el mecanismo de llamada a/regreso de las funciones. Tambin soporta la creacin, mantenimiento y destruccin de las variables automticas de cada funcin a la que se llama. A medida que se hace la llamada a cada funcin, sta puede a su vez, llamar a otras funciones, la cual, a su vez, puede llamar a otras funciones; todo ello antes de que regrese alguna de las funciones. En cierto momento, cada funcin debe regresar el control a la funcin que la llam. Por ende, de alguna manera debemos llevar el registro de las direcciones de retorno que requiere cada funcin para regresar el control a la funcin que la llam. La pila de llamadas a funciones es la estructura de datos perfecta para manejar esta informacin. Cada vez que una funcin llama a otra funcin, se mete una entrada en la pila. Esta entrada, conocida como marco de pila o registro de activacin, contiene la direccin de retorno que necesita la funcin a la que se llam para poder regresar a la funcin que hizo la llamada. Tambin contiene cierta informacin adicional que veremos en breve. Si la funcin a la que se llam regresa, en vez de llamar a otra funcin antes de regresar, se saca el marco de pila para la llamada a la funcin, y el control se transfi ere a la direccin de retorno en el marco de la pila que se sac.
6.12 Funciones con listas de parmetros vacas
En C++, una lista de parametros vacia se especifi ca mediante void o nada entre parentesis. El prototipo void imprimir(); especifica que la funcion imprimir no recibe argumentos y no devuelve un valor. La fi gura 6.17 demuestra ambas formas de declarar y usar funciones con listas de parametros vacias.
6.13 Funciones en lnea
Es bueno implementar un programa como un conjunto de funciones desde el punto de vista de la ingenieria de software, pero las llamadas a funciones implican una sobrecarga en tiempo de ejecucion. C++ cuenta con las funciones en lnea para ayudar a reducir la sobrecarga de las llamadas a funciones; en especial para las funciones pequenas. Al colocar el califi cador inline antes del tipo de valor de retorno de la funcion en su defi nicion, se aconseja al compilador para que genere una copia del codigo de la funcion en ese lugar (cuando sea apropiado) para evitar la llamada a una funcion. La desventaja es que se insertan multiples copias del codigo de la funcion en el programa (lo cual aumenta su tamano) en vez de que haya una sola copia de la funcion, a la cual se le pasa el control cada vez que se realiza una llamada. El compilador puede ignorar el califi cador inline, y por lo general lo hace para todas las funciones, excepto las mas pequenas.
6.14 Referencias y parmetros de referencias
Dos formas de pasar argumentos a las funciones en muchos lenguajes de programacion son el paso por valor y el paso por referencia. Cuando se pasa un argumento por valor, se crea una copia del valor del argumento y se pasa (en la pila de llamadas a funciones) a la funcion que se llamo. Las modifi caciones a la copia no afectan al valor de la variable original en la funcion que
hizo la llamada. Esto evita los efectos secundarios accidentales que tanto obstaculizan el desarrollo de sistemas de software correctos y confiables