c++ - 如果使用优化 (-O2, -O3),为什么这段代码的行为会有所不同?

标签 c++ optimization compiler-construction

我不得不编写一些检查例程,如果使用 -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 在所有优化变体中都正确,其他两个没有。

最佳答案

Signed integer overflow gives undefined behavior.因此,编译器可以随心所欲地实现这种情况。

关于c++ - 如果使用优化 (-O2, -O3),为什么这段代码的行为会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20706528/

相关文章:

linux - 对于服务器来说,写入大的日志文件比写入较小的日志文件压力更大吗?

java - 在 JavaScript 中创建本地值的方法

c# - 编译器错误取决于方法签名中的参数位置。使用未分配的局部变量

c++ - OpenMP - 二叉树

c++ - 无法创建动态文件夹名称

c++ - 像素文本到 3d 网格转换库

c - 谁负责清理?

c++ - Raspberry Pi 上的字节顺序问题

optimization - 你最喜欢的低级代码优化技巧是什么?

c - 添加编译阶段