我必须编写一些检查例程,如果使用-O0,-O1,-O2或-O3,它们的行为似乎不同。
下面我创建了一个适用于-O0和-O1的最小示例。但是使用-O2或-O3时行为发生了变化。在-O0和-O1情况下,for循环递增整数,并且第一次达到最大值时,发生溢出并且检查例程触发。在另一种情况下,for循环永远不会中断,尽管整数变为负数。
#include <iostream>
inline bool check(const int i) {
if (i < 0)
return false;
else
return true;
}
int main() {
for (int i = 0;; i += 50000000) {
std::cout << i << std::endl;
const bool succ = check(i);
if (succ == false) {
std::cout << "Overflow: " << i << std::endl;
break;
}
}
return 0;
}
为什么编译器允许优化它?
尝试使用gcc,clang和icc,只有icc在所有优化变体中都正确,其他两个没有。