Следующий код тестирования корректно работает в 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 должен вести себя таким образом? Мне что-то не хватает?
