小编Sam*_*uel的帖子

编译器是否允许删除无限循环,例如带有-O2的英特尔C++编译器?

以下测试代码在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没有理由以这种方式行事?我想念什么吗?

c++ optimization icc

11
推荐指数
2
解决办法
1554
查看次数

标签 统计

c++ ×1

icc ×1

optimization ×1