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

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

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

Saved successfully!

Ooh no, something went wrong!