13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!