Следующий код тестирования корректно работает в 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 (release), он начинает бесконечно "doSomething".
Так как это однопоточная программа, а isEmpty()
должна оцениваться как true
, я не могу найти причины, по которой ICC должен вести себя таким образом? Мне что-то не хватает?