我正在审查一个C ++ MFC项目。在某些文件的开头有这一行:
#pragma optimize("", off)
我知道这会为以下所有功能关闭优化。但这样做的动机通常是什么呢?
答案 0 :(得分:24)
我专门使用它来获取特定代码集中的更好的调试信息,其余的应用程序是通过优化编译的。当由于应用程序的性能要求而无法运行完整的调试构建时,这非常有用。
答案 1 :(得分:16)
我发现生产代码是正确的,但却非常复杂,以至于它会使优化器混淆产生错误的输出。这可能是关闭优化的原因。
但是,我认为代码很可能只是错误,具有未定义的行为。优化器暴露了这种情况并导致错误的运行时行为或崩溃。如果没有优化,代码就会发生。#34;工作。"而不是找到并删除潜在的问题,有人"固定"它通过禁用优化并将其留在那里。
当然,这很脆弱,并且可以获得变通方法。新的硬件,新的操作系统补丁,新的编译器补丁,其中任何一个都可以打破这样的修复。"
即使这个编译指示是出于第一个原因,也应该大量记录。
答案 2 :(得分:8)
这些在代码库中的另一个原因......这是一个意外。
这是一个非常方便的工具,用于在调试时关闭特定文件上的优化器 - 正如上面提到的Ray。
如果在提交之前没有仔细审查更改列表,那么这些行很容易进入代码库,只是因为在提交其他更改时它们“偶然”仍在那里。
答案 3 :(得分:5)
我知道这是一个老话题,但我想补充一点,使用这个指令还有另一个原因 - 虽然与大多数应用程序开发人员无关。
在编写设备驱动程序或其他低级代码时,优化程序有时会生成不能正确与硬件交互的输出。
例如,需要读取内存映射寄存器(但不使用读取的值)来清除中断的代码可能会被编译器优化,从而产生无效的汇编代码。
这也可以说明为什么(正如Angew指出的那样)应明确记录使用该指令。