Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 260 — #298<br />
✐<br />
Capítulo 9. Funciones inline<br />
int second() {<br />
updateLocal();<br />
return local.tm_sec;<br />
}<br />
};<br />
#<strong>en</strong>dif // CPPTIME_H ///:~<br />
Las funciones de la librería C estándar ti<strong>en</strong><strong>en</strong> múltiples repres<strong>en</strong>taciones para<br />
el tiempo, y todas ellas son parte de la clase Time. Sin embargo, no es necesario<br />
actualizar todos ellos, así que time_t se usa para la repres<strong>en</strong>tación base, y tm local<br />
y la repres<strong>en</strong>tación ASCII asciiRep ti<strong>en</strong><strong>en</strong> banderas para indicar si han sido<br />
actualizadas para el time_t actual. Las dos funciones privadas updateLocal() y<br />
updateAscii() comprueban las banderas y condicionalm<strong>en</strong>te hac<strong>en</strong> la actualización.<br />
El constructor llama a la función mark() (que el usuario puede llamar también<br />
para forzar al objeto a repres<strong>en</strong>tar el tiempo actual), y eso limpia las dos banderas<br />
para indicar que el tiempo local y la repres<strong>en</strong>tación ASCII ya no son válidas. La<br />
función ascii() llama a updateAscii(), que copia el resultado de la función de<br />
la librería estándar de C asctime() <strong>en</strong> un buffer local porque asctime() usa una<br />
área de datos estática que se sobreescribe si la función se llama <strong>en</strong> otra parte. El valor<br />
de retorno de la función ascii() es la dirección de ese buffer local.<br />
Todas las funciones que empiezan con daylightSavings() usan la función<br />
updateLocal(), que causa que la composición resultante de inlines sea bastante<br />
larga. No parece que valga la p<strong>en</strong>a, especialm<strong>en</strong>te considerando que probablem<strong>en</strong>te<br />
no quiera llamar mucho a esas funciones. Sin embargo, eso no significa que todas las<br />
funciones deban ser no-inline. Si hace otras funciones no-inline, al m<strong>en</strong>os mant<strong>en</strong>ga<br />
updateLocal() como inline de modo que su código se duplique <strong>en</strong> las funciones<br />
no-inline, eliminando la sobrecarga extra de invocación de funciones.<br />
Este es un pequeño programa de prueba:<br />
//: C09:Cpptime.cpp<br />
// Testing a simple time class<br />
#include "Cpptime.h"<br />
#include <br />
using namespace std;<br />
int main() {<br />
Time start;<br />
for(int i = 1; i < 1000; i++) {<br />
cout