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 246 — #284<br />

✐<br />

Capítulo 8. Constantes<br />

modo, el <strong>en</strong>torno modifica el dato (posiblem<strong>en</strong>te mediante multitarea, multihilo o<br />

interrupciones), y volatile indica la compilador que no haga suposiciones sobre<br />

el dato, especialm<strong>en</strong>te durante la optimización.<br />

Si el compilador dice, «yo guardé este dato <strong>en</strong> un registro anteriorm<strong>en</strong>te, y no he<br />

tocado ese registro», normalm<strong>en</strong>te no necesitará leer el dato de nuevo desde memoria.<br />

Pero si esa variable es volatile, el compilador no debe hacer esa suposición<br />

porque el dato puede haber cambiado a causa de otro proceso, y debe releer el dato<br />

<strong>en</strong> vez de optimizar el código (dicha optimización consiste <strong>en</strong> eliminar la lectura<br />

redundante que se hace normalm<strong>en</strong>te).<br />

Pued<strong>en</strong> crearse objetos volatile usando la misma sintaxis que se usa para crear<br />

objetos constantes. También puede crearse objetos volatile constantes que no pued<strong>en</strong><br />

cambiarse por el programador cli<strong>en</strong>te pero se pued<strong>en</strong> modificar por una <strong>en</strong>tidad<br />

aj<strong>en</strong>a al programa. Aquí se muestra un ejemplo que repres<strong>en</strong>ta una clase asociada<br />

con algún elem<strong>en</strong>to físico de comunicación.<br />

//: C08:Volatile.cpp<br />

// The volatile keyword<br />

class Comm {<br />

const volatile unsigned char byte;<br />

volatile unsigned char flag;<br />

<strong>en</strong>um { bufsize = 100 };<br />

unsigned char buf[bufsize];<br />

int index;<br />

public:<br />

Comm();<br />

void isr() volatile;<br />

char read(int index) const;<br />

};<br />

Comm::Comm() : index(0), byte(0), flag(0) {}<br />

// Only a demo; won’t actually work<br />

// as an interrupt service routine:<br />

void Comm::isr() volatile {<br />

flag = 0;<br />

buf[index++] = byte;<br />

// Wrap to beginning of buffer:<br />

if(index >= bufsize) index = 0;<br />

}<br />

char Comm::read(int index) const {<br />

if(index < 0 || index >= bufsize)<br />

return 0;<br />

return buf[index];<br />

}<br />

int main() {<br />

volatile Comm Port;<br />

Port.isr(); // OK<br />

//! Port.read(0); // Error, read() not volatile<br />

} ///:~<br />

Como ocurre con const, se puede usar volatile para los atributos de la clase,<br />

246<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!