为什么如果使用优化(-O2、-O3),此代码的行为会有所不同
Why does this code behave differently if optimizing (-O2, -O3) is used?
我不得不编写一些检查例程,如果使用 -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 在所有优化变体中都正确,而其他两个则没有。
有符号整数溢出会产生未定义的行为。 因此,编译器可以自由地按照自己的喜好实现这种情况。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么括号在这个简单的代码中会有所不同
- 为什么对于几乎相同的代码,矢量化的行为会有所不同
- 为什么如果使用优化(-O2、-O3),此代码的行为会有所不同
- 在C++程序中使用_asm代码会有所不同吗?