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

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

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

Saved successfully!

Ooh no, something went wrong!