Il seguente codice di test funziona correttamente in VS con debug o release e anche in GCC. Funziona correttamente anche per ICC con debug, ma non quando l'ottimizzazione è abilitata (-O2
).I compilatori sono autorizzati a rimuovere loop infiniti come Intel C++ Compiler 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;
}
Si suppone di fermarsi allo while(q.isEmpty())
. Quando -O2
è abilitato in ICC (release), tuttavia, inizia a "fare qualcosa" all'infinito.
Dal momento che questo è a thread singolo programma eisEmpty()
dovrebbero essere valutati come true
, riesco a trovare alcun motivo per il CPI dovrebbe comportarsi in questo modo? Mi manca qualcosa?
Aiuta se m_first e m_last sono dichiarate come 'volatili'? Non ho accesso a ICC. – Chubsdad
Un altro pensiero selvaggio: ha a che fare con il fatto che% s non è specificato con printf. printf ("% s", "non dovrebbe raggiungere qui \ r \ n") ;? – Chubsdad
Correlati: [I compilatori sono autorizzati ad eliminare i loop infiniti?] (Http://stackoverflow.com/questions/2178115/are-compilatori-allontanati-per-eliminare-infinite-loops) –