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 272 — #310<br />

✐<br />

Capítulo 9. Funciones inline<br />

cosa más que ellos deb<strong>en</strong> resolver. <strong>C++</strong> es sufici<strong>en</strong>tem<strong>en</strong>te complicado sin añadir<br />

confusión, así que int<strong>en</strong>te no abusar de las macros del preprocesador siempre que<br />

pueda.<br />

9.8. Resum<strong>en</strong><br />

Es crítico que sea capaz de ocultar la implem<strong>en</strong>tación subyac<strong>en</strong>te de una clase<br />

porque puede querer cambiarla después. Hará estos cambios por efici<strong>en</strong>cia, o porque<br />

haya alcanzado una mejor compr<strong>en</strong>sión del problema, o porque hay alguna clase<br />

nueva disponible para usar <strong>en</strong> la implem<strong>en</strong>tación. Cualquier cosa que haga peligrar<br />

la privacidad de la implem<strong>en</strong>tación subyac<strong>en</strong>te reduce la flexibilidad del l<strong>en</strong>guaje.<br />

Por eso, la función inline es muy importante porque prácticam<strong>en</strong>te elimina la necesidad<br />

de macros de preprocesador y sus problemas asociados. Con inline, los métodos<br />

pued<strong>en</strong> ser tan efici<strong>en</strong>tes como las macros.<br />

Por supuesto se puede abusan de las funciones inline <strong>en</strong> las definiciones de clase.<br />

El programador está t<strong>en</strong>tado de hacerlo porque es fácil, así que lo hace. Sin embargo,<br />

no es un problema grave porque después, cuando se busqu<strong>en</strong> reducciones de tamaño,<br />

siempre puede cambiar las inline a funciones conv<strong>en</strong>cionales dado que no afecta<br />

a su funcionalidad. La pauta debería ser «Primero haz el trabajo, después optimiza».<br />

9.9. Ejercicios<br />

Las soluciones a los ejercicios se pued<strong>en</strong> <strong>en</strong>contrar <strong>en</strong> el docum<strong>en</strong>to electrónico<br />

titulado «The Thinking in <strong>C++</strong> Annotated Solution Guide», disponible por poco<br />

dinero <strong>en</strong> www.BruceEckel.com.<br />

1. Escriba un programa que use la macro F() mostrada al principio del capítulo<br />

y demuestre que no se expande apropiadam<strong>en</strong>te, tal como describe el texto.<br />

Arregle la macro y demuestre que funciona correctam<strong>en</strong>te.<br />

2. Escriba un programa que use la macro FLOOR() mostrada al principio del capítulo.<br />

Muestre las condiciones <strong>en</strong> que no funciona apropiadam<strong>en</strong>te.<br />

3. Modifique MacroSideEffects.cpp de modo que BAND() funcione adecuadam<strong>en</strong>te.<br />

4. Cree dos funciones idénticas, f1() y f2(). Haga inline a f1() y deje f2-<br />

() como no-inline. Use la función clock() de la librería C estándar que se<br />

<strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> para marcar los puntos de comi<strong>en</strong>zo y fin y compare<br />

las dos funciones para ver cuál es más rápida. Puede que necesite hacer un<br />

bucle de llamadas repetidas para conseguir números repres<strong>en</strong>tativos.<br />

5. Experim<strong>en</strong>te con el tamaño y complejidad del código de las funciones del ejercicio<br />

4 para ver si puede <strong>en</strong>contrar el punto donde la función inline y la conv<strong>en</strong>cional<br />

tardan lo mismo. Si dispone de ellos, inténtelo con compiladores distintos<br />

y fíjese <strong>en</strong> las difer<strong>en</strong>cias.<br />

6. Pruebe que las funciones inline hac<strong>en</strong> <strong>en</strong>lazado interno por defecto.<br />

7. Cree una clase que cont<strong>en</strong>ga un array de caracteres. Añada un constructor inline<br />

que use la función memset() de la librería C estándar para inicializar el<br />

array al valor dado como argum<strong>en</strong>to del constructor (por defecto será ’ ’), y un<br />

método inline llamado print() que imprima todos los caracteres del array.<br />

272<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!