Następujący kod testowy działa poprawnie w VS z debugowaniem lub wydaniem, a także w GCC. Działa również poprawnie dla ICC z debugowaniem, ale nie wtedy, gdy włączona jest optymalizacja (-O2
).Czy kompilatory mogą usuwać nieskończone pętle, takie jak kompilator Intel C++ z opcją -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;
}
Ma się zatrzymać pod adresem while(q.isEmpty())
. Jednak gdy opcja -O2
włączona pod ICC (release), nieskończenie zaczyna "robić coś".
Ponieważ jest jednowątkowy Program iisEmpty()
należy ocenić jako true
mogę znaleźć żadnego powodu MTK powinien zachowywać się w ten sposób? Czy coś mi brakuje?
to pomoże, jeśli m_first i m_last są zadeklarowane jako 'lotny'? Nie mam dostępu do ICC. – Chubsdad
Kolejna szalona myśl: ma to związek z tym, że% s nie jest określony przez printf. printf ("% s", "nie powinno tu dotrzeć \ r \ n") ;? – Chubsdad
Powiązane: [Czy kompilatory mogą eliminować nieskończone pętle?] (Http://stackoverflow.com/questions/2178115/silniki-zablokowane-to-eliminate-infinite-loops) –