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