Следующий код тестирования работает правильно в VS с отладкой или выпуском, а также в GCC. Это также верно для ICC с отладкой, но не при включенной оптимизации (-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;
}
Предполагается остановиться на while(q.isEmpty())
. Однако, когда -O2
включен в ICC (выпуск), он начинает бесконечно "делать что-то".
Поскольку это однопоточная программа и isEmpty()
следует оценивать как true
, я не могу найти причину, по которой ICC должен вести себя таким образом? Я что-то пропустил?