Der folgende Testcode wird in VS entweder mit Debug oder Release und auch in GCC korrekt ausgeführt. Es funktioniert auch korrekt für ICC mit Debug, aber nicht wenn Optimierung aktiviert ist (-O2
).Können Compiler Endlosschleifen entfernen wie Intel C++ Compiler mit -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;
}
Es soll bei while(q.isEmpty())
stoppen. Wenn -O2
unter ICC (release) aktiviert ist, beginnt es jedoch unendlich "zu tun".
Da es sich um Single-Threaded-Programm undisEmpty()
sollte als true
ausgewertet werden, ich keinen Grund, das ICC auf diese Weise finden sich verhalten sollten? Vermisse ich etwas?
es, wenn m_first und m_last hilft als 'flüchtig' deklariert werden? Ich habe keinen Zugang zu ICC. – Chubsdad
Noch ein wilder Gedanke: Hat es damit zu tun, dass% s nicht mit printf angegeben ist. printf ("% s", "sollte nicht hierher \ r \ n" kommen) ;? – Chubsdad
Related: [Sind Compiler erlaubt, unendliche Schleifen zu beseitigen?] (Http://stackoverflow.com/questions/2178115/are-compilers-allowed-to-eliminate-infinite-loops) –