次のテスト コードは、デバッグまたはリリースを使用して 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())
です。ただし、ICC (リリース) で有効にする-O2
と、無限に "doSomething" を開始します。
これはシングル スレッド プログラムであり isEmpty()
、として評価する必要があるtrue
ため、ICC がこのように動作する理由がわかりません。私は何かが恋しいですか?