以下测试代码在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;
}
Run Code Online (Sandbox Code Playgroud)
它应该停在while(q.isEmpty()).-O2然而,当在ICC(发布)下启用时,它无限地开始"doSomething".
由于这是单线程程序并且 isEmpty()应该被评估为true,我发现ICC没有理由以这种方式行事?我想念什么吗?