Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 255 — #293<br />
✐<br />
9.2. Funciones inline<br />
una función ordinaria se obti<strong>en</strong>e con una función inline. La única difer<strong>en</strong>cia es que<br />
una función inline se expande <strong>en</strong> el mismo sitio, como una macro de preprocesador,<br />
de modo que la cabecera de una llamada a función es eliminada. Por ello no debería<br />
usar macros (casi) nunca, solo funciones inline.<br />
Cualquier función definida <strong>en</strong> el cuerpo de una clase es automáticam<strong>en</strong>te inline,<br />
pero también puede hacer una función inline que no esté d<strong>en</strong>tro del cuerpo de una<br />
clase, precediéndola con la palabra clave inline. De todos modos, para que esto t<strong>en</strong>ga<br />
algún efecto, debe incluir el cuerpo de la función con la declaración, de otro modo el<br />
compilador tratará esa función como una declaración de una función ordinaria. Así:<br />
inline int plusOne(int x);<br />
no ti<strong>en</strong>e ningún otro efecto que declarar la función (que puede o no obt<strong>en</strong>er una<br />
definición inline después). La aproximación correcta proporciona el cuerpo de la función:<br />
inline int plusOne(int x) { return ++x; }<br />
Observe que el compilador revisará (como siempre lo hace), el uso apropiado<br />
de la lista de argum<strong>en</strong>tos de la función y del valor de retorno (haci<strong>en</strong>do cualquier<br />
conversión necesaria), algo que el preprocesador es incapaz de hacer. Además, si<br />
int<strong>en</strong>ta escribir lo anterior como una macro de preprocesador, obt<strong>en</strong>drá un efecto no<br />
deseado.<br />
Casi siempre querrá poner las funciones inline <strong>en</strong> un fichero de cabecera. Cuando<br />
el compilador ve una definición como esa pone el tipo de la función (la firma combinada<br />
con el valor de retorno) y el cuerpo de la función <strong>en</strong> su tabla de símbolos.<br />
Cuando use la función, el compilador se asegura de que la llamada es correcta y el<br />
valor de retorno se está usando correctam<strong>en</strong>te, y <strong>en</strong>tonces sustituye el cuerpo de la<br />
función por la llamada a la función, y de ese modo elimina la sobrecarga. El código<br />
inline ocupa espacio, pero si la función es pequeña, realm<strong>en</strong>te ocupará m<strong>en</strong>os espacio<br />
que el código g<strong>en</strong>erado para una llamada a función ordinaria (colocando los<br />
argum<strong>en</strong>tos <strong>en</strong> la pila y ejecutando el CALL).<br />
Una función inline <strong>en</strong> un fichero de cabecera ti<strong>en</strong>e un estado especial, dado que<br />
debe incluir el fichero de cabecera que conti<strong>en</strong>e la función y su definición <strong>en</strong> cada<br />
fichero <strong>en</strong> donde se use la función, pero eso no provoca un error de definición múltiple<br />
(sin embargo, la definición debe ser idéntica <strong>en</strong> todos los sitios <strong>en</strong> los que se<br />
incluya la función inline).<br />
9.2.1. inline d<strong>en</strong>tro de clases<br />
Para definir una función inline, debe anteponer la palabra clave inline al nombre<br />
de la función <strong>en</strong> el mom<strong>en</strong>to de definirla. Sin embargo, eso no es necesario cuando<br />
se define d<strong>en</strong>tro de una clase. Cualquier función que defina d<strong>en</strong>tro de una clase<br />
es inline automáticam<strong>en</strong>te. Por ejemplo:<br />
//: C09:Inline.cpp<br />
// Inlines inside classes<br />
#include <br />
#include <br />
using namespace std;<br />
255<br />
✐<br />
✐<br />
✐<br />
✐