以下测试代码在 VS 中使用调试或发布以及在 GCC 中都能正确运行。-O2
它也适用于带有调试的 ICC,但在启用优化时 ( )则不正确。
#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 应该以这种方式运行的理由?我想念什么吗?