在大多数C或C++环境中,存在"调试"模式和"释放"模式编译.
看看两者之间的区别,您会发现调试模式添加了调试符号(通常是许多编译器上的-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!(该功能毕竟不做任何事......)
最重要的是,启用优化的调试代码可能是一个巨大的痛苦!特别是如果你有大功能.
请注意,启用优化会更改代码!在某些环境(安全关键系统)中,这是不可接受的,正在调试的代码必须是发送的代码.在这种情况下需要进行优化调试.
虽然优化和非优化代码应该在"功能上"等效,但在某些情况下,行为会发生变化.
这是一个简单的例子:
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块(我们初始化为0,它永远不会是1)
可以将指针访问移动到寄存器 - >无I/O更新,而不是访问存储器
内存访问可能被缓存(不一定与编译器优化相关)
在所有这些情况下,行为将完全不同,很可能是错误的.