【发布时间】:2011-04-01 11:12:16
【问题描述】:
以下测试代码在 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 时,它开始无限地“做某事”。
既然这是单线程程序并且 isEmpty() 应该被评估为true,我找不到 ICC 应该以这种方式运行的理由?我错过了什么吗?
【问题讨论】:
-
如果 m_first 和 m_last 被声明为 'volatile' 有帮助吗?我无权访问 ICC。
-
另一个疯狂的想法:它是否与 printf 未指定 %s 的事实有关。 printf("%s", "不应该到达这里\r\n");?
-
指出您正在测试哪个版本的 ICC 以及在哪个平台上对您很有帮助。
-
@Samuel:如果让成员“易变”有帮助,我想知道供我参考。这应该抑制任何优化标志效果
标签: c++ optimization icc