El siguiente código de prueba funciona correctamente en VS, ya sea con depuración o versión, y también en GCC. También funciona correctamente para ICC con depuración, pero no cuando la optimización está habilitada (-O2
).¿Los compiladores pueden eliminar bucles infinitos como el compilador Intel C++ con -O2?
#include <cstdio>
class tClassA{
public:
int m_first, m_last;
tClassA() : m_first(0), m_last(0) {}
~tClassA() {}
bool isEmpty() const {return (m_first == m_last);}
void updateFirst() {m_first = m_first + 1;}
void updateLast() {m_last = m_last + 1;}
void doSomething() {printf("should not reach here\r\n");}
};
int main() {
tClassA q;
while(true) {
while(q.isEmpty()) ;
q.doSomething();
}
return 1;
}
Se supone que parar en while(q.isEmpty())
. Cuando -O2
habilitado en ICC (versión), sin embargo, comienza a "hacer algo" infinitamente.
Dado que este es el programa y isEmpty()
deben ser evaluados como true
de un solo subproceso, no puedo encontrar ninguna razón la CPI debe comportarse de esta manera? ¿Extraño algo?
¿Ayuda si m_first y m_último se declaran como 'volátil'? No tengo acceso a ICC. – Chubsdad
Otro pensamiento alocado: tiene que ver con el hecho de que% s no se especifica con printf. printf ("% s", "no debería llegar aquí \ r \ n");? – Chubsdad
Relacionado: [¿Pueden los compiladores eliminar los bucles infinitos?] (Http://stackoverflow.com/questions/2178115/are-compilers-allowed-to-eliminate-infinite-loops) –