在大多数 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/