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