c++ - 为什么 C/C++ 程序在 Debug模式下经常会关闭优化?

标签 c++ c compiler-construction

在大多数 C 或 C++ 环境中,都有“调试”模式和“发布”模式编译。
查看两者之间的区别,您会发现 Debug模式添加了调试符号(在许多编译器上通常是 -g 选项),但它也禁用了大多数优化。
在“发布”模式下,您通常会开启各种优化。
为什么会有差异?

最佳答案

如果不进行任何优化,通过代码的流程是线性的。如果您在第 5 行并且单步执行,则进入第 6 行。启用优化后,您可以获得指令重新排序、循环展开和各种优化。
例如:


void foo() {
1:  int i;
2:  for(i = 0; i < 2; )
3:    i++;
4:  return;

在此示例中,无需优化,您可以单步执行代码并点击第 1、2、3、2、3、2、4 行

启用优化后,您可能会得到如下所示的执行路径:2、3、3、4 甚至只是 4! (这个函数毕竟什么都不做……)

归根结底,启用优化的调试代码可能会非常痛苦!特别是如果您有大型函数。

请注意,开启优化会更改代码!在某些环境(安全关键系统)中,这是 Not Acceptable ,被调试的代码必须是交付的代码。在这种情况下,必须通过优化进行调试。

虽然优化后的代码和未优化的代码在“功能上”应该是等效的,但在某些情况下,行为会发生变化。
这是一个简单的例子:

    int* ptr = 0xdeadbeef;  // some address to memory-mapped I/O device
    *ptr = 0;   // setup hardware device
    while(*ptr == 1) {    // loop until hardware device is done
       // do something
    }

关闭优化后,这很简单,您也知道会发生什么。 但是,如果您启用优化,可能会发生以下情况:

  • 编译器可能会优化 while block (我们初始化为 0,它永远不会是 1)
  • 指针访问可能会移至寄存器而不是访问内存->无 I/O 更新
  • 内存访问可能被缓存(不一定与编译器优化相关)

在所有这些情况下,行为都会大不相同,而且很可能是错误的。

关于c++ - 为什么 C/C++ 程序在 Debug模式下经常会关闭优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69250/

相关文章:

c++ - 用 2x1 和 1x2 多米诺骨牌拼贴 2xN 网格的方法有多少种?

c++ - pthread 的定时器中断

c++ - 使用 OpenCV 的 imread() 从 qrc 读取图像

c - 如何调用参数数量可变的函数?

c++ - 内存:编译器如何选择存储变量的位置?

c++ - 检查派生类的数据成员

c - 如何让这个 shell 解析 C 语言中带有引号的语句?

c - 结构返回并与 main 中的另一个函数进行比较

c++ - VC++编译器和类型转换?

c - VS2013 假设 .c 文件的未识别符号的外部声明