Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 265 — #303<br />
✐<br />
9.4. Funciones inline y el compilador<br />
Si toda la información del tipo de la función <strong>en</strong>caja <strong>en</strong> el contexto de la llamada,<br />
<strong>en</strong>tonces la llamada a la función se sustituye directam<strong>en</strong>te por el código inline,<br />
eliminando la sobrecarga y permiti<strong>en</strong>do que el compilador pueda hacer más optimizaciones.<br />
Además, si el inline es un método, la dirección del objeto(this) se pone <strong>en</strong><br />
el lugar apropiado, que es, por supuesto, otra acción que el preprocesador es incapaz<br />
de hacer.<br />
9.4.1. Limitaciones<br />
Hay dos situaciones <strong>en</strong> que el compilador no puede efectuar la sustitución de inline.<br />
En estos casos, simplem<strong>en</strong>te convierte la función a la forma ordinaria tomando la<br />
definición y pidi<strong>en</strong>do espacio para la función como hace con una función no-inline.<br />
Si debe hacerlo <strong>en</strong> varias unidades de traducción (lo que normalm<strong>en</strong>te causaría un<br />
error de definición múltiple), informa al <strong>en</strong>lazador que ignore esas definiciones múltiples.<br />
En compilador no puede efectuar la sustitución de inline si la función es demasiado<br />
complicada. Esto dep<strong>en</strong>de de cada compilador particular, pero aunque muchos<br />
compiladores lo hagan, no habrá ninguna mejora de efici<strong>en</strong>cia. En g<strong>en</strong>eral, se considera<br />
que cualquier tipo de bucle es demasiado complicado para expandir como una<br />
inline, y si lo pi<strong>en</strong>sa, el bucle implica mucho más tiempo que el que conlleva la sobrecarga<br />
de la invocación de la función. Si la función es simplem<strong>en</strong>te una colección se<br />
s<strong>en</strong>t<strong>en</strong>cias simples, probablem<strong>en</strong>te el compilador no t<strong>en</strong>drá ningún problema para<br />
utilizar inline, pero si hay muchas s<strong>en</strong>t<strong>en</strong>cias, la sobrecarga de llamada será mucho<br />
m<strong>en</strong>or que el coste de ejecutar el cuerpo. Y recuerde, cada vez que llame a una función<br />
inline grande, el cuerpo completo se inserta <strong>en</strong> el lugar de la llamada, de modo<br />
que el tamaño del código se inflará fácilm<strong>en</strong>te sin que se perciba ninguna mejora<br />
de r<strong>en</strong>dimi<strong>en</strong>to. (Note que algunos de los ejemplos de este libro pued<strong>en</strong> exceder el<br />
tamaño razonable para una inline a cambio de mejorar la estética de los listados.<br />
El compilador tampoco efectúa sustituciones inline si la dirección de la función<br />
se toma implícita o explícitam<strong>en</strong>te. Si el compilador debe producir una dirección,<br />
<strong>en</strong>tonces t<strong>en</strong>drá que alojar el código de la función y usar la dirección resultante. Sin<br />
embargo, cuando no se requiere una dirección, probablem<strong>en</strong>te el compilador hará la<br />
sustitución inline.<br />
Es importante compr<strong>en</strong>der que una declaración inline es sólo una suger<strong>en</strong>cia al<br />
compilador; el compilador no está forzado a hacer nada. Un bu<strong>en</strong> compilador hará<br />
sustituciones inline para funciones pequeñas y simples mi<strong>en</strong>tras que ignorará las<br />
que sean demasiado complicadas. Eso le dará lo que espera - la auténtica semántica<br />
de una llamada a función con la efici<strong>en</strong>cia de una macro.<br />
9.4.2. Refer<strong>en</strong>cias adelantadas<br />
Si está imaginando que el compilador [FIXME: is doing to implem<strong>en</strong>t inlines],<br />
puede confundirse p<strong>en</strong>sando que hay más limitaciones que las que exist<strong>en</strong> realm<strong>en</strong>te.<br />
En concreto, si una inline hace una refer<strong>en</strong>cia adelanta a una función que no ha<br />
sido declarada aún <strong>en</strong> la clase (sea inline o no), puede parecer que el compilador no<br />
sabrá tratarla.<br />
//: C09:EvaluationOrder.cpp<br />
// Inline evaluation order<br />
class Forward {<br />
265<br />
✐<br />
✐<br />
✐<br />
✐