当前位置:  开发笔记 > 编程语言 > 正文

为什么C/C++程序经常在调试模式下关闭优化?

如何解决《为什么C/C++程序经常在调试模式下关闭优化?》经验,为你挑选了1个好方法。

在大多数C或C++环境中,存在"调试"模式和"释放"模式编译.
看看两者之间的区别,您会发现调试模式添加了调试符号(通常是许多编译器上的-g选项),但它也会禁用大多数优化.
在"发布"模式下,您通常会启用各种优化.
为什么不同?



1> Benoit..:

没有任何优化,代码流是线性的.如果您在第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更新,而不是访问存储器

内存访问可能被缓存(不一定与编译器优化相关)

在所有这些情况下,行为将完全不同,很可能是错误的.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有